簡體   English   中英

為什么原始類型的數組不被視為對象

[英]why arrays of primitive types are not considered as objects

我知道java中的數組擴展了對象,所以為什么將它們作為params傳遞不起作用。

public static void main(String[] args) {
    foo(new Integer[]{1, 2, 3}); // 1
    foo(new int[]{1,2,3});   //2
}

static void foo(Object... params) {
    System.out.println(params[0]);
}

此外,為什么它不將數組視為單個參數(第1行)

運行上面的輸出是:

1
[I@3e25a5

在java中,每個具有(X ...)簽名的函數都將X的數組作為參數。

在第一個示例中,您會收到警告,表示您正在將整數數組作為vararg對象傳遞而不進行強制轉換。 Java非常聰明,您可能希望將其作為Object []而不是單個Object傳遞。 如果向對象[]添加強制轉換,警告將消失。

在第二個例子中,數組僅被稱為THE FIRST vararg,因為每個數組都是一個對象。 它不能作為對象數組傳遞,因為它是一個基元數組。

任何類型的數組都是對象,因為您可以驗證運行此代碼段

public class Test{
    public static void test(Object a) {
        System.out.println("ok");
    }

    public static void main(String args[]){
        int[] i = {1,2,3,4};
        test(i);
    }
}

它打印“ok”,這意味着int []是一個Object。

我剛剛嘗試了你的代碼,我得到了:

1
[I@71f6f0bf

問題是,你的方法通過varargs獲取一個Object數組。 因此,對於第一次調用, params是包含每個Integer的3個元素的數組。 但是, int不是Object s( int的Wrapper類, Integer ,is,但int不是),因此對於第二次調用, params是包含實際數組對象的單個元素的數組。 上面的亂碼是數組的toString()方法的輸出。

如果您要用Object[]替換varargs調用,則第二次調用將不會編譯,因為int[]不是Object[]

Object ...將數組解釋為參數列表,而不是單個對象。 為什么不使用Set作為容器呢?

暫無
暫無

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

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