Может ли JIT воспользоваться преимуществами Generics? - PullRequest
8 голосов
/ 27 июля 2011

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

Но, тем не менее, информация о типе присутствует в файле класса и может быть отображена с помощью отражения:

public class Demo
{
    private List<String> list;

    public Demo() throws SecurityException, NoSuchFieldException
    {
        System.out.println(((Class<?>)((ParameterizedType) getClass().getDeclaredField("list").getGenericType()).getActualTypeArguments()[0]).getName());
    }

    public static void main(String[] args) throws SecurityException, NoSuchFieldException
    {
        new Demo();
    }
}

При выполнении будет напечатано java.lang.String.

Может ли JIT использовать это для какой-то оптимизации? Или эта информация с точки зрения JIT бесполезна?

Ответы [ 2 ]

3 голосов
/ 27 июля 2011

Может, но, насколько я знаю, нет. Чтобы обойти это, Scala недавно добавила поддержку специализации типа общего кода обобщенного кода, который генерирует специализированные версии класса - без каких-либо преобразований - и помещает их в остальную часть кодовой базы прозрачно, так что код все еще работает, как и ожидалось. В этих случаях скомпилированный код Scala на самом деле может быть заметно быстрее, чем Java, поскольку Java с Generics всегда будет использовать приведение.

2 голосов
/ 27 июля 2011

Невозможно JVM избежать приведения объекта, поскольку базовая коллекция может не иметь строк. например если стирание используется для добавления целого числа в список.

Я не могу думать о потенциальной оптимизации, и есть много потенциальных оптимизаций, которые JIT не делает. ;)

...