仅在通用类型上取消选中投射警告

时间:2016-03-07 11:27:15

标签: java casting

代码示例#1:

$args = array(
    'year'     => 2016,
    'monthnum' => 1,
    'order'    => 'ASC'
);
query_posts( $args );

代码示例#2:

public class Foo implements Cacheable {
}

public class Fooer {
    void doSomething(Cacheable obj) {
        Foo foo = (Foo) obj; //#1
    }
}

为什么我会选择"未选中的广告素材:'可缓存'到' FooClass'"在#2的情况下警告但在#1的情况下不警告?这两个案例对我来说似乎完全一样。我错过了什么,或者代码检查员稍微破了吗?

PS:我正在使用InteliJ IDEA社区版。

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

1 个答案:

答案 0 :(得分:1)

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

如果是#1: 通过使用强制转换(Foo),您告诉编译器信任您,Cacheable obj绝对是Foo。因此编译器只检查类层次结构并继续。 (如果您尝试在不同的类层次结构之间转换对象,则会出现错误) 但是,如果它不是Foo,则在运行时将抛出ClassCastException。

如果是#2: 泛型本质上旨在提供更严格的类型检查。请参阅Java Doc: Java Generics

因此编译器确保为您提供警告。

另请参阅Generics:Type Erasure