代码示例#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:我知道如何绕过这个警告,唯一的问题是为什么它在这里,如果它不在那里。答案 0 :(得分:1)
在这两种情况下,您都在做一些无法保证的事情。在实际确定它将是Foo之前,你将obj转换为Foo。为什么不同的行为?
如果是#1: 通过使用强制转换(Foo),您告诉编译器信任您,Cacheable obj绝对是Foo。因此编译器只检查类层次结构并继续。 (如果您尝试在不同的类层次结构之间转换对象,则会出现错误) 但是,如果它不是Foo,则在运行时将抛出ClassCastException。
如果是#2: 泛型本质上旨在提供更严格的类型检查。请参阅Java Doc: Java Generics
因此编译器确保为您提供警告。
另请参阅Generics:Type Erasure