簡體   English   中英

沒有一點可以將instanceof與原始類型數組一起使用嗎?

[英]Is there No Point to use instanceof with primitive types array?

這在某種程度上與詢問: 在原始類型的子類/超類中有任何東西一樣嗎?

(因為((Object) (new String[6])) instanceof Object[]為true,因為String extends Object 。)

例如,的int[] ((Object) (new int[3])) instanceof int[]是真實的,在Java中的東西?

如果是這樣的話,

((Object) (new int[3])) instanceof int[]

與...相同

((Object) (new int[3])).getClass() == int[].class

我更喜歡后者,因為它應該更快,因為它不必檢查每個類型/類的繼承。

確實很難理解您的要求,但我認為您正在詢問對數組類型使用getClass()是否比對instanceof使用更好。

從可讀性的角度來看, instanceof更好:

   Object obj = new int[3];

   if (obj instanceof int[]) {
       int[] array = (int[]) obj;
   }

   if (foo.getClass() == int[].class) {
       int[] array = (int[]) obj;
   }

顯然,第一種形式更具可讀性。

從性能的角度來看,我不明白為什么這兩個版本不能是相同的。 instanceof情況下, int[]類型沒有子類型,因此可以將其編譯為等效於甚至可能比 getClass()版本更快的東西。

確保更快的唯一方法是編寫一個不錯的微基准,並在您感興趣的平台上運行它。並且請注意,對於不同版本的Java,您可能會獲得不同的性能結果。

但是,我強烈懷疑性能差異太小而無法對您的應用程序產生任何影響。 除非您已經有具體的分析結果指出這是一個瓶頸,否則您可能正在浪費時間。


這在某種程度上與詢問:在原始類型的子類/超類中有任何東西一樣嗎?

不。這根本不等於問這個。 Java數組類型不是原始類型。 它們是參考類型。

但是,這與數組類型之間是否存在子類型關系的問題有關。 或更准確地說,可以歸結為是否可以從一種數組類型轉換為另一種數組類型。

答案取決於基本類型。 參見JLS 5.5.1。 參考型鑄造 如果基本類型是(不同)原始類型,那么答案是否定的。 如果基本類型是引用類型,則可以從一種基本類型( BC1 )轉換為另一種基本類型( BC2 ),那么涉及數組類型( BC1[]BC2[] )的轉換也是合法的。

因此,這意味着instanceofgetClass()測試對於原始數組類型將給出相同的答案,但並非對所有數組類型都給出相同的答案。


實際上,在原始Java語言設計中允許在不同數組類型之間進行任何強制轉換都是一個錯誤。 這會導致如下異常:

    Object[] a = new String[1];
    a[0] = new Object();  // throws ArrayStoreException !!!

(A的B實例)在A為“ isa” B時,或者在可以期望B的地方使用A時,返回true。
使用==進行的類對象或類名稱的任何比較都會比較其身份。 如果您需要知道A和B的類型完全相同,則可以使用A.getClass()== B.getClass()。 基本類型不繼承自Object,但數組繼承。 例如,你可以說

if(new int[2] instanceof Object)

但不是

if(new int[2] instanceof Object[])

后者將無法編譯。

在面向對象編程中,您通常關心的是等效性而不是精確類型。 我會爭辯說,您幾乎總是想測試適用性(使用instanceof)而不是身份(使用==)。
請注意,不需要將其強制轉換為Object。

if(new String[2] instanceof Object[])
    System.out.println("true");

Java不是純粹的OO編程語言,因為存在原始數據類型。

問:是否有任何東西可以繼承或繼承原始類型?

答:不,原始沒有超類的子類,它只是原始類型。

Java中的數組是對象類型,它的內容是否是原始類型的對象類型,因此以下語句為真:

 System.out.println("Is int[] instance of Object:"+(intArray instanceof Object));       
 System.out.println("The type of int[] is:"+(intArray instanceof int[]));
 System.out.println("Is the class of intArray equal to int[]:"+  
           (intArray.getClass()==int[].class));

問:我更喜歡后者,因為它應該更快,因為它不必檢查每個類型/類的繼承。

答:沒有,沒有證據。 即使這是真的,但在Java中這不是問題,因為效率並不總是我們考慮的問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM