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有一天也会这样做。 也许他们会按照你所建议的方式去做。 或者可能不是。

像这样的事情最终可以通过瓦哈拉项目来解决。