java - 为什么在 T 是类型参数而 t 是变量的情况下不允许使用 "t instanceof T"?

标签 java generics instanceof type-parameter

Eclipse 表示由于泛型类型橡皮擦,类型参数不允许使用 instanceof 操作。

我同意在运行时不会保留任何类型信息。但是请考虑以下类的通用声明:

class SomeClass<T>{
    T t;
    SomeClass(Object o){
        System.out.println(o instanceof T);   // Illegal
    }   
}        

在运行时,不会出现 T!但是如果我实例化这个Integer类型的类,那么对应的对象就会有一个Integer类型的字段t。

那么,为什么我不能用 T 检查一个变量的类型,它可以在运行时被 Integer 替换。我实际上会做类似“o instanceof Integer”的事情。

在哪些情况下,允许带有类型参数的 instanceof 会导致麻烦,以至于被禁止?

最佳答案

But if I instantiate this class of type Integer, then the corresponding object will have a field t of type Integer

不,不会。它将有一个对象类型的字段。只是每次您访问它时,它都会被转换为一个整数。

考虑以下代码:

SomeClass<Integer> c = new SomeClass<Integer>();
SomeClass untyped = (SomeClass)c; // Which type was it?
SomeClass<String> stringTyped = (SomeClass<String>)untyped; // Now it's STRING??

有效。给你一堆编译器警告,但有效。因为字段 T 实际上是 Object 类型,可以转换为任何类型。

关于java - 为什么在 T 是类型参数而 t 是变量的情况下不允许使用 "t instanceof T"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8741984/

相关文章:

c# - 如何将我的方法更改为泛型方法?我的代码有什么问题?

java - 为什么我们不应该创建一个 Spring MVC Controller @Transactional?

Java教程说我可以有一个包私有(private)接口(interface),但我不能

.net - 插入到通用字典中可能存在重复键吗?

angular - 如何在 Angular 数据类型上使用 ngSwitch?

java - 如何将 JSON 中的 Java 对象的实例类型发送到 Java Spring-Server Post 请求?

php - instanceof 闭包返回 false

java - mapstruct - 将字段值映射到属性

java - 消息 : Invalid byte 1 of 1-byte UTF-8 sequence in hadoop

java - 在泛型类中扩展 Interface 时出现 NoSuchFieldError