


















接著,我定義了D類對象d,使用instanceof關鍵字判斷d是不是C.顯然對象d是屬于C的,這就好像:造紙廠繼承了抽象接口工廠,那么造紙廠當然也是工廠啦。下面,我們來看一下另外一種情況:








那么instanceof或者轉型在哪些地方使用才有意義呢?
1.A繼承B
當A繼承自B時,A類對象a顯然是B類,舉個簡單的例子,Manager類繼承Employee類,那么經理類的實例manager當然也是Employee啦,因為即使你是經理,你也是公司的員工.
2.B繼承A
當B繼承自A事,A類對象a有可能是B類,也有可能不是B類。舉個例子,當我們這樣實例化時A a = new B();那么對象a就是B類型的啦,但當我使用A a = new A()時,a就不是B類型的了。這就好像經理是員工,而員工不一定都是經理一樣。
3.A與接口C
A直接繼承自接口C就不說了,來說一下A不直接繼承自接口C。由于A的子類有可能繼承自接口C,因此這種判斷也就存在意義了。假設我們這樣實例化:A a = new E(),其中E是A的子類,而且也繼承接口C。那么我們使用 a instanceof C時,就會是true。因為對象a確實是接口C。
其他情況:
在泛型中使用instanceof時,會拋出Cannot perform instanceof check against parameterized type List<String>. Use instead its raw form List since generic type information will be erased at runtime錯誤,字面意思是instanceof關鍵字不能用于參數化的類型判斷,建議使用原生類型。這個可能是java遺留的歷史原因,因為在jdk5之前,java中沒有泛型概念,而instanceof在以前的版本中已經實現,因此使用該功能對泛型進行判斷時,會出現錯誤.