简而言之:为什么我不能用Java编写以下代码?
public class Foo<T> {
public void foo(Object bar) {
if (bar instanceof T) {
// todo
}
}
}
是的,我知道,仿制药有点被Java攻击。在Java 1.5之前,泛型不存在,并且泛型类型在运行时丢失。
我也知道,它有一些模式。例如:
public class Foo<T> {
Class<T> clazz;
public Foo(Class<T> clazz) {
this.clazz = clazz;
}
public void foo(Object bar) {
if (clazz.isInstance(bar)) {
// todo
}
}
}
我的问题是,为什么不是由编译器自动完成的?
对于存在任何泛型类型的每个类,编译器可以为每个构造函数自动添加一个(或更多,如果我有更多泛型类型)参数,并将这些值绑定到私有字段。每次,我写bar instanceof T
它可以将其编译为clazzOfGenericT.isInstance(bar)
。
有没有理由,这没有实施?
我不完全确定,这不会破坏向后兼容性* - 但是,新的JVM语言(如Scala或Kotlin)为何没有这个功能?
*:恕我直言,它可以完成,不会有任何向后兼容性。
答案 0 :(得分:3)
添加到Java的功能的提议是缓慢的,并且有更高优先级的功能。 &#34;他们还没有得到它。&#34;
Generics直到Java 1.5才出现,并且泛型类型在运行时丢失。
...
我的问题是,为什么它不是由编译器自动完成的?
对于存在任何泛型类型的每个类,编译器可以为每个构造函数自动添加一个(或更多,如果我有更多泛型类型)参数,并将这些值绑定到私有字段。
那么,现在,您只是在问为什么Java不会为运行时存储泛型类型信息。你要求具体化。答案是Java的泛型是用你已经知道的擦除来实现的。
是的,可以进行具体化,其他语言也可以。是的,也许Java有一天也会这样做。也许他们会以类似于你建议的方式来做。或许不是。
这样的事情最终可以通过Project Valhalla解决。