众所周知,泛型类型无法在编译过程中存活下来。它们被类转换所取代。
但是,类型信息存在于类文件中并且可以使用反射看到:
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 的角度来看,这些信息是无用的吗?
最佳答案
可以,但据我所知不能。为了解决这个问题,Scala 最近在编译时添加了一些支持 type specialization生成类的专门版本的通用代码——没有任何强制转换——并将它们透明地放置到代码库的其余部分,以便代码仍然按预期工作。在这些情况下,编译后的 Scala 代码实际上比 Java 快得多,因为具有泛型的 Java 将始终使用强制转换。
关于java - JIT 能否从泛型中获益?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6841839/