带接口的实例
instanceof with an interface
如果我尝试使用错误的 instanceof 运算符 class,我会收到编译错误(“Animal cannot be converted to String”),但使用接口时我不会收到编译时错误。
例如:在第 10 行中,我收到一个编译错误,因为 Animal 不是 String 的子class。但是在第 14 行,即使 Animal 没有实现 List 接口,我也没有收到编译错误。
class Animal {
}
public class InstanceOf {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Animal a = new Animal();
if (a instanceof String ){ //line 10
System.out.println("True");
}
if (a instanceof List ){ //line 14
System.out.println("True");
}
}
}
a
永远不能是 String 的 instanceof,因此会出现编译错误。
a
可以是 List
的实例,如果 Animal
的某些子 class 将实现 List
接口并且您将分配一个实例这样子class到a
。因此编译器允许它。
来自 JLS :
If a cast (§15.16) of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.
这只是我根据这个问题做的实验。
class Animal {}
interface AnimalA {}
class AnimalB{}
class AnimalC extends Animal,AnimalB {} //not possible
class AnimalD extends Animal implements AnimalA{} //possible
public class InstanceOfTest {
public static void main(String[] args) {
Animal a = new Animal();
if(a instanceof AnimalA) { //no compile time error
System.out.println("interface test");
}
if(a instanceof AnimalB) { //compile time error
System.out.println("interface test");
}
if(a instanceof List) { //compile time error
System.out.println("interface test");
}
if(a instanceof ArrayList) { //compile time error
System.out.println("interface test");
}
}
}
因此正如@Eran 所说,因为 Animal
不是 AnimalB
的子 class,其子 class 的子class 不能成为 [= 的实例12=]。但另一方面,它的任何子 class 都可以实现 interface
List.
如果我尝试使用错误的 instanceof 运算符 class,我会收到编译错误(“Animal cannot be converted to String”),但使用接口时我不会收到编译时错误。
例如:在第 10 行中,我收到一个编译错误,因为 Animal 不是 String 的子class。但是在第 14 行,即使 Animal 没有实现 List 接口,我也没有收到编译错误。
class Animal {
}
public class InstanceOf {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Animal a = new Animal();
if (a instanceof String ){ //line 10
System.out.println("True");
}
if (a instanceof List ){ //line 14
System.out.println("True");
}
}
}
a
永远不能是 String 的 instanceof,因此会出现编译错误。
a
可以是 List
的实例,如果 Animal
的某些子 class 将实现 List
接口并且您将分配一个实例这样子class到a
。因此编译器允许它。
来自 JLS :
If a cast (§15.16) of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.
这只是我根据这个问题做的实验。
class Animal {}
interface AnimalA {}
class AnimalB{}
class AnimalC extends Animal,AnimalB {} //not possible
class AnimalD extends Animal implements AnimalA{} //possible
public class InstanceOfTest {
public static void main(String[] args) {
Animal a = new Animal();
if(a instanceof AnimalA) { //no compile time error
System.out.println("interface test");
}
if(a instanceof AnimalB) { //compile time error
System.out.println("interface test");
}
if(a instanceof List) { //compile time error
System.out.println("interface test");
}
if(a instanceof ArrayList) { //compile time error
System.out.println("interface test");
}
}
}
因此正如@Eran 所说,因为 Animal
不是 AnimalB
的子 class,其子 class 的子class 不能成为 [= 的实例12=]。但另一方面,它的任何子 class 都可以实现 interface
List.