我在學校遇到了一個問題,詢問型別轉換的型別以及是否會發生錯誤。
InterfaceA obj = new ClassB();
ClassA obj2 = obj;
我知道由于 ClassB 是抽象的,第一行會導致編譯時錯誤。但是,從具有物件參考 InterfaceA 的實際物件型別 ClassB 向上轉換到 ClassA 的第二行是否可行?(如果 ClassB 不是抽象的)
鑒于以下 UML 類圖:

uj5u.com熱心網友回復:
它不會編譯;保證為 type 的物件InterfaceA不一定也為 type ClassA。即使ClassB是在InterfaceA您撰寫此代碼時實作的唯一可用類(代碼未設定為琥珀色;也許稍后有人會撰寫另一個類)。
但是,添加演員表,當然,它會。
這個:
InterfaceA obj = new ClassB();
正在創建 2 個完全不相關的東西。一個名為 的區域變數obj,它就像一個帶有標題的便條,您可以在上面寫下地址。便利貼受到限制;你只能在那里寫通向紅色屋頂房屋的地址。(假設這就是InterfaceA代表的東西)。
然后,您單獨建造一所房子。房子沒有名字。這所房子確實有一個紅色屋頂(您正在實體化的類實作了InterfaceA)。然后你在你的便利貼上寫下這座新建房子的地址,這沒關系——畢竟它有一個紅色的屋頂。
房子對 postit 一無所知,也不在乎。便利貼的存在根本不會改變房子。不可能去房子然后問房子:你能告訴我全世界所有帶有你地址的郵局的位置嗎?在 Java 術語中:在物件上有一個變數點不會以任何方式修改該物件,根本不可能從一個物件轉到參考它的變數。
然后你做:
ClassA obj2 = obj;
這將創建另一個標題為 postit。它的標題是“obj2”,它被限制為只允許在那里寫磚砌房屋的地址。
然后,您嘗試使用您的objpostit(僅限于有紅色屋頂房屋的地址),并將該地址復制到您的新 postit 上。您當然不會創建第二個房子(new 如果您想創建另一個物件,則需要參與 java),您只是在復制一個地址。
不過,郵局便條警察阻止了您:雖然您的obj郵局上的地址可能是磚砌的,但也可能不是;該objpostit可以僅僅保證屋頂是紅色的,而不是它是由磚塊砌成的。
使用強制轉換操作:
ClassA obj2 = (ClassA) obj;
代碼現在可以編譯(如果您要運行它并abstract從 中洗掉修飾符ClassB,它將成功運行)。轉換操作只是檢查,它不會改變任何屋頂或以其他方式轉換任何東西。該代碼將開到房子里,檢查它是否是磚砌的。
如果是,那太好了,您可以復制地址。如果不是,則拋出 ClassCastException。
在任何情況下,轉換運算子都不會轉換任何內容,除非 中的東西()是原始型別(轉換運算子執行 3 種完全不同的事情:轉換原始型別、型別檢查具體型別,并告訴編譯器關閉泛型而不檢查任何內容)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/363116.html
下一篇:如何表示在運行時派生的靜態常量?
