假设我有一节课:

public class GClass implements GInterface<Impl> {
// other code
  @Override
  public Class<SomeClass> getType() {
    return SomeClass.class
  }
}

实现泛型接口的:

public interface GInterface<T extends OtherClass> {
// other code
  Class<SomeClass> getType();
}

然后我调用getType():

GInterface gi = new GClass();
Class<SomeClass> type = gi.getType(); // <- gives warning

我在这里得到警告有什么意义呢?getType()的结果不是泛型的(它没有使用泛型类型参数T),而是静态定义为Class<SomeClass>.因此,编译器应该知道Class<SomeClass> type = gi.getType()getType()%安全的,对吗?

我错过什么了吗?

我预计电话:Class<SomeClass> type = gi.getType()不会产生任何警告.

UPDATE: 我现在发现它与类型参数gi有关. 这会生成警告(我的问题是为什么?):

GInterface gi = new GClass();
Class<SomeClass> type = gi.getType(); // <- gives warning

不会发出警告:

GInterface<?> gi = new GClass();
Class<SomeClass> type = gi.getType(); // <- Doesnt give warning

推荐答案

GInterface gi是一种原始类型.Java的工作方式是,原始类型基本上将您置于类型判断器中的"向后兼容模式",在这种模式下,类型的工作方式就像泛型发明之前一样(也就是说,就像您在编写Java 1.4代码一样).特别是,该类型的方法签名在编译时计算中完全go 除了泛型.

这意味着对于GInterface gi,getType()返回的是原始Class,而不是Class<SomeClass>.然后将该原始类型分配给泛型类型,这就是警告的来源.

(请注意,此警告非常有用:因为您正在从原始类型转换为泛型类型,所以编译器无法判断转换是否正确.Class<FooBar> type = gi.getType()也可以编译,但在运行时不会像您预期的那样工作.)

将类型声明为GInterface<?> gi意味着它不再是原始类型,因此getType()‘S编译时类型是泛型’edClass<SomeClass>.

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

查找最大子数组的和

最小拓Flutter 排序的时间复杂度是多少?

Java函数式编程中的双值单值映射

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

所有 case 一起输入时输出错误,而单独放置时输出正确

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

如何找到MongoDB文档并进行本地化?

Java编译器抛出可能未正确初始化的错误?

如何在ApachePOI中将图像添加到工作表的页眉?

Spring Data JPA慢慢地创建了太多非活动会话

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

用户填充的数组列表永不结束循环

Java SSLKeyManager出厂密码

如何在太阳系模拟器中添加月球?

Android Studio模拟器没有互联网

如何处理两个几乎相同的XSD文件?

Java.time.OffsetDateTime的SQL Server数据库列类型是什么?

在Java中将.GRF转换为图像文件

java.exe如何执行java源代码?