先上代碼
public interface Read{
}
public class Student implements Read{
}
public class Create{
private Read read;
public void setRead(Read read){
this.read=read;
}
public Read getRead(){
return this.read;
}
}
現在在另一個類的方法中
Read read=new Create().getRead();
下面有兩個問題:
1.如果 read instanceof Student 返回true 還是 false
2.Student stu=(Student)read; 能這麼寫麼?為什麼呢?
首先,第一個問題,read instanceof Student返回值跟你的Read傳遞的實際類型有關系,如果傳遞的是一個Student對象,是會返回true的。
測試代碼:
public class Create {
private Read read;
public void setRead(Read read) {
this.read = read;
}
public Read getRead() {
return this.read;
}
public static void main(String[] args) {
Create t = new Create();
t.setRead(new Student());
Read read=t.getRead();
System.out.println(read instanceof Student );
}
}
修正你的Create代碼,傳遞Read對象為Student的實現時,第一個問題就是true,當然如果傳入的Read不是Student的實例,就是false.
其次,這個問題,跟第一個問題的本質是一樣的,要看傳遞的Read的實際類型是什麼,如果是我測試類給的Student的實例,那麼就能正確轉換成功,但是如果是其他Read的實現,這個這句話不會報編譯錯誤,卻會有運行時異常。測試代碼如下:
public class OtherRead implements Read{
@Override
public void read() {
System.out.println("other read.");
}
public static void main(String[] args) {
Create t = new Create();
t.setRead(new OtherRead());
Read read=t.getRead();
System.out.println(read instanceof Student );
Student s = (Student)read;
}
}
上述測試傳入的是其他Read的實現類的對象,那麼就會運行是異常:
false
Exception in thread "main" java.lang.ClassCastException: bit.OtherRead cannot be cast to bit.Student
at bit.OtherRead.main(OtherRead.java:16)