簡體   English   中英

arguments 類型是否與參數一起傳遞給方法?

[英]Are type arguments passed along with an argument to a method?

根據我自己的實驗,我得出的結論是,任何類型的 arguments 的 object 或 object 引用在作為參數傳遞給方法時都會被剝離。 如果方法的參數使用類型參數進行參數化,則會彈出 arguments 類型的問題:

<T> void method (ArrayList<T> list) {
    list.add( (T) new Integer(4));
    sysout (list.get(0));
}

然后,如果我們將兩個參數化的 ArrayList 中的每一個傳遞給此方法的調用:

method(new ArrayList<Integer>());
method(new ArrayList<String>());

我們將看到兩者都不會產生錯誤並且都打印 4。我假設編譯器將T的擦除保留為Object 這個實驗是否不能證明 arguments 類型沒有傳遞給方法?

ArrayList<T>的情況實際上與普通T的情況相同。 在這兩種情況下, T在編譯時用於 static 類型檢查的目的。 然而,在運行時, T被擦除。

查看您發布的代碼,編譯后的方法相當於:

void method (ArrayList<Object> list) {
    list.add( (Object) new Integer(4));
    sysout (list.get(0));
}

並且調用是有效的:

method(new ArrayList<Object>());
method(new ArrayList<Object>());

因此,從運行時的角度來看,您將Object存儲在ArrayList<Object>中,這很好。

現在,如果 memory 服務,您應該收到有關表達式(T) new Integer(4)的未經檢查的強制轉換的警告。 這是一個很好的警告,需要注意。 如果目標類型與實際類型不兼容,強制轉換通常會拋出異常,但在這種情況下, T在運行時不存在,因此無法動態檢查 - 強制轉換是無操作的。 但是,如果我們修改示例以返回強制轉換的值,您可以在運行時開始看到問題:

<T> T method (ArrayList<T> list) {
    T value = (T) new Integer(4);
    list.add(value);
    return value;
}

接着

String result = method(new ArrayList<String>());

即使轉換成功(它只是一個空操作),當返回值被分配給result時,也會拋出異常,因為該值是Integer而不是String

這只是一個簡單的情況,其中編譯器未啟用以強制您在特定范圍內使用T 正如您所注意到的,這有點像您的method()方法不關心T作為一種類型。

代碼正在編譯,但有警告。 您對T的未經檢查的強制轉換並非總是沒有后果:

ArrayList<String> strings = new ArrayList<>();
method(strings);
System.out.println(strings.get(0));

和:

Exception in thread "main" java.lang.ClassCastException: 
    java.lang.Integer cannot be cast to java.lang.String

此異常由System.out.println(strings.get(3)); ,因為對println的調用與采用 String 的重載相關聯,並且強制轉換未通過。

這意味着盡管method()不檢查轉換為T (在編譯時或運行時),但調用者會檢查。 在我的main()方法中, T被推斷為String並且運行時能夠執行相關的類型檢查。

我假設編譯器將T的擦除保留為Object

粗略地說,是的。 但是在T是有界的其他情況下,編譯器將能夠強制執行更多的類型安全。 以下甚至不會編譯:

static <T extends String> void method(ArrayList<T> list) {
    list.add((T) new Integer(4));
    System.out.println(list.get(0));
}

所以,“這個實驗不是證明 arguments 類型沒有傳遞給方法嗎?” 不,這只是眾多場景中的一種。

暫無
暫無

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

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