当前位置: 首页 > 知识库问答 >
问题:

对象到泛型类型转换的未检查警告的定义在哪里?

凌俊材
2023-03-14

JLS 5.1.9将未检查的转换定义如下:

让G用n个类型参数命名一个泛型类型声明。

从原始类或接口类型G到形式G的任何参数化类型都有未经检查的转换

从原始数组类型G[]到表单G的任何数组类型的转换是未经检查的

除非G,否则使用未经检查的转换会导致编译时未经检查的警告

据我所知,如果您将原始类型转换为具有有界类型参数的泛型类型,则会发生未检查的转换。

public class DoubleStar{

    public static void print(Object object){
       ((A<String>)object).print();
    }

    public static void main(String[] args){
        print(new Object());
    }
}

class A<T>{
    public void print(){
        System.out.print("HELLO");
    }
}

由于Object不是原始类型(AFAIK),为什么上面的代码应该生成未经检查的强制转换警告,以及定义这种行为的位置?


共有2个答案

周作人
2023-03-14

因为当你把一个对象投射到一个A

陈飞语
2023-03-14

你看错了部分,这就是为什么在你的例子中它似乎没有意义。

您收到的警告是未经检查的强制类型。您正在查看未经检查的转换(相关)部分。

参见5.5.2"已检查的铸件和未检查的铸件"

从S型到T型的转换静态已知是正确的,当且仅当S

从类型S到参数化类型(§4.5)T的转换未经检查,除非至少满足以下条件之一:

  • S

从类型S到类型变量T的转换不被选中,除非S

如果从|S|到|T|的转换静态已知正确,则从S到T的未检查转换完全未检查。否则,它部分未检查。

除非SuppressWarnings注释(§9.6.3.5)禁止,否则未经检查的强制转换会导致编译时未经检查的警告。

如果静态上不知道强制类型转换是正确的,并且没有取消选中,则会检查强制类型转换。

如果强制转换到引用类型不是编译时错误,则有以下几种情况:

  • 施法静态已知是正确的。

不会对此类强制转换执行运行时操作。

  • 演员阵容是完全不受约束的

不会对此类强制转换执行运行时操作。

  • 演员表是部分未检查的演员表。

这种强制转换需要运行时有效性检查。检查的执行就像强制转换是在|S|和|T|之间进行的检查一样,如下所述。

  • 演员阵容为格子型

这种强制转换需要运行时有效性检查。如果运行时的值为null,则允许强制转换。否则,让R是运行时引用值引用的对象的类,让T是强制转换运算符中命名的类型的擦除(§4.6)。强制转换必须在运行时通过§5.5.3中的算法检查类R是否与类型T兼容。

请注意,当这些规则首次应用于任何给定的强制转换时,R不能是接口,但如果规则是递归应用的,则R可能是接口,因为运行时引用值可能引用元素类型为接口类型的数组。

 类似资料:
  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 我正在堆栈中实现一个列表链接。该程序成功通过了所有必需的测试,但我遇到了此警告。程序的实现没有中断,但我正在寻求消除此问题。你能告诉我如何通过编辑Equals方法中的代码来修复它吗?未选中的强制转换:“java.lang.对象”到“LinkedStack”

  • 问题内容: 不知何故,我的旧问题已关闭,因此我打开了一个新问题: 我正在使用Java泛型从SQL查询中实现泛型双向Hash Map。它应该能够来回映射String,Integer对的任何组合。应该这样使用: 当然应该可以创建一个pm(Integer,Integer)等等。 我选择地图的实现如下所示(没有getter …): 我没有编译器错误,而且我很确定,它将以这种方式工作。但是我在“ getIn

  • 假设我有一个map。现在我只想从中获取条目并创建一个新的map与这些条目。 我正在尝试做以下事情: 这似乎可行,但我得到了一个警告:类型模式(String,Int)中的非变量类型参数字符串未选中,因为它已被擦除消除。 我怎样才能摆脱警告?

  • 问题内容: 我不明白为什么在尝试执行以下操作时会收到警告(未经检查的演员表): 我的意思是将castedMap发布到外部代码的危险是什么?两种操作均可在运行时完美运行: 使用SomeType类型的键从castedMap获取元素 使用SomeType类型的键将元素放入castedMap中。 我只是使用@SuppressWarnings(“ unchecked”)取消警告。 问题答案: 答案可能很无聊

  • 问题内容: 就像我们使用__ToString一样,有没有一种方法来定义铸造方法? 问题答案: 无需在php中键入强制类型转换。 编辑: 由于这个话题似乎引起一些混乱,我想我要详细说明一下。 在Java之类的语言中,有两种可能带有类型。编译器有一个关于类型的概念,而运行时还有一个关于类型的想法。编译器的类型与变量相关,而运行时引擎则跟踪值的类型(已将其分配给变量)。变量类型在编译时是已知的,而值类型