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

上一篇: Instance of T (generic type) in Java

下一篇: d facet labels using a labeller in ggplot2 >= 2.0