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

Nag*_*mos 7 java generics

简而言之:为什么我不能用Java编写以下代码?

public class Foo<T> {
    public void foo(Object bar) {
        if (bar instanceof T) {
            // todo
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是的,我知道,仿制药有点被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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

有什么理由,这没有实现?

我不完全确定,这不会破坏向后兼容性* - 但是,新的JVM语言(如Scala或Kotlin)为何没有这个功能?

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

Rad*_*def 3

关于添加到 Java 的功能的提案进展缓慢,并且存在更高优先级的功能。“他们还没有做到这一点。”

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

...

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

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

好吧,现在,您只是想问为什么 Java 不存储运行时的泛型类型信息。你要求具体化。答案是Java的泛型是通过擦除来实现的,这一点你已经知道了。

是的,具体化是可能的,其他语言也可以做到。是的,也许有一天 Java 也会这么做。也许他们会按照你建议的方式去做。或者可能不是。

类似的问题最终可以通过Valhalla 项目来解决。