java - 为什么泛型参数上的通配符需要显式转换?

标签 java

<分区>

我有一个函数:

<T> T get(Class<T> fetchType) {
    ...
}

所以,如果我要做这样的事情:

String x = get(String.class);

这一切都很好。

然而,在另一个函数中:

<R> R otherFunction(R base) {
    return get(base.getClass());
}

给我一​​个错误,因为 base.getClass()返回 ? extends R .

reason: no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to R
inference variable T has incompatible bounds:
equality constraints: capture of ? extends Object upper bounds: Object, R

现在据我了解,函数 get(Class<T> x)返回 T , 所以当用 ? extends R 调用时,假设是 CAP#1 , 但自 get现在返回 CAP#1 , 将其分配给类型 R应该不是问题。为了对此进行测试,我尝试了:

Class<? extends CharSequence> stringClass = String.class;
CharSequence x = get(stringClass);

这似乎没有任何问题。出了什么问题?

编辑:这是因为类型删除,在运行时没有关于 R 的信息吗?可用,但 CharSequence是?这仍然没有意义,因为这不是仅在编译阶段进行的纯粹检查吗?

所以,结果是 Object.getClass()返回 Class<? extends |X|>而不是 Class<? extends X> , 其中|X|是删除 X这就是为什么它适用于具体类型(如 ? extends CharSequence ,但不适用于通用类型)。 IntelliJ 可能没有准确报告,这导致了困惑:http://i.imgur.com/yE8LswM.jpg (我尝试截屏,但弹出窗口一直在消失)。

最佳答案

原因在 Object.getClass 的Javadoc中有描述。 :

public final Class<?> getClass()

The actual result type is Class<? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.

因此,当您调用 base.getClass() ,实际结果为Class<?> , 自从删除 RObject .这不是 Class<? extends R> .

关于java - 为什么泛型参数上的通配符需要显式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40605303/

相关文章:

java - 什么是最好的 java 开源 dbf 驱动程序?

java - 第一次应用程序启动时再次加载 Activity

java - 使用 Junit 比较文本文件

java - 对密码进行哈希处理和加盐处理,然后尝试稍后获取未哈希处理的密码

java - Glass 上的语音通话操作无法调用设置的联系电话号码

java - gradle 构建 : class, 接口(interface),或预期的枚举

java - 多个参数的多重分派(dispatch)

java - @Validated 注解无效

Java Swing 绘制的形状消失

java - JDBC程序从一个表中选择数据并插入到不同数据库中的另一个表中