JIT可以从泛型中获益吗?

yan*_*kee 8 java optimization jit

众所周知,泛型类型在编译过程中无法存在.他们被类演员取代.

但是,类型信息存在于类文件中,可以使用反射查看:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

执行时,将打印java.lang.String.

JIT可以将它用于某种优化吗?或者从JIT的角度来看这些信息是无用的?

Esk*_*sko 3

可以,但据我所知不行。为了解决这个问题,Scala 最近添加了对通用代码的编译时类型特化的支持,该支持生成类的专门版本(无需任何强制转换)并将它们透明地放置到代码库的其余部分,以便代码仍然按预期工作。在这些情况下,编译后的 Scala 代码实际上比 Java 快得多,因为带有泛型的 Java 将始终使用强制转换。