java - Java 中 T(泛型)的实例

标签 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
        }
    }
}

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

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

有什么原因,这没有实现吗?

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

*:恕我直言,它可以在不破坏任何向后兼容性的情况下完成。

最佳答案

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

Generics wasn't there until Java 1.5, and the generic type is lost during runtime.

...

My question is, why isn't it automatically done by the compiler?

For each class, where any generic type is present, the compiler could automatically add one (or more, if I have more generic types) parameter for each constructor, and bind those values to private fields.

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

是的,具体化是可能的,其他语言也可以。是的,也许有一天 Java 也会这样做。也许他们会按照您建议的方式进行操作。或许不是。

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

关于java - Java 中 T(泛型)的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36585185/

相关文章:

java - "cURL -u"使用 Apache HTTPClient 的 API key 授权

java - 使用一条命令创建 keystore 文件

java - 我无法在 android studio 中创建项目。显示插件错误。许多插件包括java gradle也无法加载

java - 将 C# 中的泛型类扩展的非泛型类转换为 Java

Java泛型——桥接方法

java - 原始类型。对泛型类型的引用应该被参数化

JAVA-日期间隔时间,错误的结果

java - 尝试将字符串解析为 int 时出错

scala按类型过滤

java - 如何检查从 Hibernate 中的查询对象返回的用户列表的类型?