[英]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.