Java中的T(泛型类型)实例

时间:2016-04-12 22:26:12

标签: java generics

简而言之:为什么我不能用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)为何没有这个功能?

*:恕我直言,它可以完成,不会有任何向后兼容性。

1 个答案:

答案 0 :(得分:3)

添加到Java的功能的提议是缓慢的,并且有更高优先级的功能。 &#34;他们还没有得到它。&#34;

  

Generics直到Java 1.5才出现,并且泛型类型在运行时丢失。

     

...

     

我的问题是,为什么它不是由编译器自动完成的?

     

对于存在任何泛型类型的每个类,编译器可以为每个构造函数自动添加一个(或更多,如果我有更多泛型类型)参数,并将这些值绑定到私有字段。

那么,现在,您只是在问为什么Java不会为运行时存储泛型类型信息。你要求具体化。答案是Java的泛型是用你已经知道的擦除来实现的。

是的,可以进行具体化,其他语言也可以。是的,也许Java有一天也会这样做。也许他们会以类似于你建议的方式来做。或许不是。

这样的事情最终可以通过Project Valhalla解决。