Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅在泛型类型上未选中强制类型转换警告_Java_Casting - Fatal编程技术网

Java 仅在泛型类型上未选中强制类型转换警告

Java 仅在泛型类型上未选中强制类型转换警告,java,casting,Java,Casting,代码示例#1: 代码示例#2: 公共类GenericFooer{ 无效剂量测定(可缓存obj){ foo类foo=(foo类)obj;/#2 } } 为什么在#2的情况下会出现“Unchecked cast:‘Cacheable’to‘FooClass’”警告,而在#1的情况下则不会?这两个案子对我来说似乎完全一样。是我遗漏了什么,还是代码检查器有点坏 附言:我正在使用InteliJ创意社区版 PSS:我知道如何避开这个警告,唯一的问题是为什么它在这里,如果它不在那里。在这两种情况下,你都在做

代码示例#1:

代码示例#2:

公共类GenericFooer{
无效剂量测定(可缓存obj){
foo类foo=(foo类)obj;/#2
}
}
为什么在#2的情况下会出现“Unchecked cast:‘Cacheable’to‘FooClass’”警告,而在#1的情况下则不会?这两个案子对我来说似乎完全一样。是我遗漏了什么,还是代码检查器有点坏

附言:我正在使用InteliJ创意社区版


PSS:我知道如何避开这个警告,唯一的问题是为什么它在这里,如果它不在那里。

在这两种情况下,你都在做一些无法保证的事情。在实际确定它将是Foo之前,您正在将obj转换为Foo。那么为什么会有不同的行为呢

如果发生#1: 通过使用cast(Foo),您告诉编译器相信您,可缓存的obj肯定是Foo。所以编译器只是检查类层次结构并继续。 (若您试图在不同的类层次结构之间强制转换对象,您将得到一个错误) 然而,若结果不是Foo,则在运行时将抛出ClassCastException

如果出现第二种情况: 泛型本质上是为提供更严格的类型检查而设计的。参见Java文档:

因此编译器会确保向您提供警告


还可以看看泛型:类型擦除

在案例1中,您将强制转换为实际类型。在案例2中,您将强制转换为一个类型参数,在执行时不知道该参数……因此,基本上唯一的原因是“如果您费心使用泛型,请做好它。”?您可以这么说。然而,在这两种情况下,你的错误是相同的——做一些不能保证的事情。当你使用泛型的时候,它被强调了。我知道这一点。我只是觉得这是不合逻辑的,警告没有出现在#1中,而是出现在#2中。你是对的。当我读到你的问题时,我也不得不认真思考几分钟。或者更好的是:如果你足够谨慎地使用泛型,我们会给你额外的警告。如果你鲁莽,我们会让你逍遥法外。惩罚那些细心的程序员!奖励那些白痴!
public class Foo implements Cacheable {
}

public class Fooer {
    void doSomething(Cacheable obj) {
        Foo foo = (Foo) obj; //#1
    }
}
public class GenericFooer<FooClass extends Cacheable> {
    void doSomething(Cacheable obj) {
        FooClass foo = (FooClass) obj; //#2
    }
}