LINUX.ORG.RU

ИМХО просто кривизна реализации дженериков. Не без соответствующей кривизны филисофии самой джавы.

asaw ★★★★★
()

Их сначала не было, потому добавили так чтобы не поломать старое. Будь мужиком передай Class<T> klass руками. Или используй Scala, она умеет передавать Class<T> klass своими руками неявно )

vertexua ★★★★★
()

Покажи конкретный пример, где тебе это надо. В ряде случаев тип вытащить можно.

Legioner ★★★★★
()

Проще реализация.

От людей «близких к телу» слышал, что в будущих версиях Java планируется информацию о типах-параметрах таки утащить в байт-код, и что это как-то связано с project lambda. Может кто больше знает?

migesok
()
Ответ на: комментарий от vertexua

Вм так говогите, как будто это избавляет рантайме от необходимости тащить жирные typetag/classtag с собой. Костыли, конечно, есть, но.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

Не избавляет. Но не уверен что они сильно жирные и для миллиардов обьектов лучше написать специализацию.

Кстати, вроде скала еще и специализации генерить умела, нужно посмотреть

vertexua ★★★★★
()

Чтобы обезьяны не в рантайме типы проверяли, а писали сразу нормально.

anonymous
()
Ответ на: комментарий от vertexua

Может быть, что и не жирные, да. Вот в spark"е практически везде тащатся класстеги, и ничего. А с другой стороны, костыль остается костылем.

cdshines ★★★★★
()

Информация сохраняется, если есть где :). Но на самом деле обычно, если такое хочется - значит ты делаешь чего-то не правильно.

    public static class MyColl extends ArrayList<String> {
    }

    public static void main(String []args) {
        ArrayList<String> test = new MyColl();
        ParameterizedType genericSuperclass = (ParameterizedType) test.getClass().getGenericSuperclass();
        System.out.println(genericSuperclass);
        System.out.println(genericSuperclass.getActualTypeArguments()[0]);
    }

java.util.ArrayList<java.lang.String>
class java.lang.String

Ну и как-то так (это чисто для примера, можно сделать и обобщённые вариант)

    public static interface Entry {
        public String ping();
    }

    public static class Base<T extends Entry> {
        public Class<Entry> getEntryClass() {
            return (Class) ((ParameterizedType)(this.getClass().getGenericSuperclass())).getActualTypeArguments()[0];
        }

        public Entry create() {
            try {
                return getEntryClass().newInstance();
            } catch (Throwable e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    }

    public static class MyEntry implements Entry {
        @Override
        public String ping() {
            return "pong";
        }
    }

    public static class MyBase extends Base<MyEntry>{}

    public static void main(String []args) {
        Base h = new MyBase();
        System.out.println("" + h.create().ping());
    }

vtVitus ★★★★★
()
Ответ на: комментарий от migesok

Если про избавление от type-erasure - то это одна из фич, которая может стать частью java 9/10. Недавно предлагалось даже высказаться о всех приемуществах/недостатках этого костыля в опросе на surveymonkey.

Если же о value-types, то это чуть ближе в воплощению в жизнь, по крайней мере на это есть jep (что, впрочем, еще ничего не значет).

nerh
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.