我正在研究在Java中進行鑄造,特別是使用接口進行鑄造。假設我有一個接口I
,限定了方法跳躍,即:Java編譯器和接口鑄造
interface I{
public void jump();
}
另外假設我有其他3類,A
,B
和C
。 A
器具I
。 B
不。然而,C
延伸B
並實施I
。
class A implements I {
public void jump(){
System.out.print("A is jumping");
}
}
class B { }
class C extends B implements I {
public void jump(){
System.out.print("C is jumping");
}
}
現在,如果我嘗試A
類型的對象分配給I
,是沒有問題的,我甚至不需要鑄造。 I.e .:
I i = new A();
好的不需要施放。
據推測,這是因爲編譯器知道另外一實現,如果我嘗試這樣的:
A mya = new A();
I i = mya;
沒有問題,即使mya
可以參考的A
一個子類。但是AFAIK沒問題,因爲編譯器知道A
的每個子類都必須隱式實現jump
方法,因此也就是接口A
。
但是,如果我嘗試將B
類型的對象分配給I
,那麼我確實需要進行強制轉換。例如
B myb = new B();
I i = (I)myb;
據推測,這是因爲編譯器知道B
沒有實現I
。但是,因爲B
可能指的是執行I
的子類,則您可以投射到I
。到現在爲止還挺好。 現在這是我的問題:如果我想將類型B
的對象指向C
(實現I
)到I
然後我們需要一個強制轉換。這是爲什麼?例如。
B b = new C();
I myI = b; //Won't compile this needs a cast
I myI = (C)b; // This will compile
myI = (I)b; // This will also compile
爲什麼不編譯器明白B
是指一個C
實現嗎?
大概是這樣做的,B
可能指的是B
這實際上並沒有實現I
但爲什麼編譯器不知道這一點?據推測,編譯器僅限於每行僅有的信息?它不能貫穿你的程序,看到b
實際上指向了C
?如果這是正確的,那麼有人可以指引我參考一些關於Java編譯器如何工作的文獻以及他們的限制是什麼?
加一個「告訴它治療」 –