繁体   English   中英

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

[英]Instance of T (generic type) in Java

简而言之:为什么我不能用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有一天也会这样做。 也许他们会以类似于你建议的方式做到这一点。 或者可能不是。

瓦尔哈拉计划最终可以解决这样的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM