T中的T(泛型)实例
简而言之:为什么我不能在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)为什么不具备此功能?
*:恕我直言,它可以完成,没有任何向后兼容性的中断。
添加到Java的功能建议缓慢移动,并且具有更高优先级的功能。 “他们还没有得到它。”
直到Java 1.5,泛型才会出现,并且泛型在运行时会丢失。
...
我的问题是,为什么它不是由编译器自动完成的?
对于每个存在任何泛型类型的类,编译器都可以为每个构造函数自动添加一个(或多个,如果我有更多泛型)参数,并将这些值绑定到专用字段。
那么,现在,在这里,您只是问为什么Java不会为运行时存储通用类型信息。 你在寻求物化。 答案是Java的泛型是通过擦除来实现的,这在你已经知道了。
是的,具体化是可能的,其他语言也可以。 是的,也许Java有一天也会这样做。 也许他们会以与您所建议的方式类似的方式做到这一点。 或者可能不是。
类似这样的事情最终可以通过Valhalla项目解决。
链接地址: http://www.djcxy.com/p/33539.html