[英]Java Generics Interface casting
我偶然發現了一個涉及泛型和接口的Java構建情況,我不明白。
請考慮以下代碼,我在其中創建List<Interface1>
。 然后get()
一個元素並將其轉換為Interface2
而沒有編譯器錯誤,盡管這兩個接口完全不相關。
import java.util.*;
public class Main {
public static void main(String ... args) {
List<Interface1> list = new ArrayList<>();
list.add(new Interface1() {});
Interface1 ok = list.get(0);
Interface2 why = (Interface2)list.get(0);
}
}
interface Interface1 {
}
interface Interface2 {
}
誰能解釋為什么在第二次get(0)
沒有編譯器錯誤?
兩個附注:執行該類會拋出ClassCastException
(如預期的那樣)。 使用兩個類而不是接口確實會產生編譯錯誤。
此行為與泛型無關:您可以將任何接口轉換為任何其他接口而不會出現編譯錯誤。
您無法對類執行此操作,因為Java可以在編譯時檢查是否可以將一個類轉換為另一個類。
但是使用接口,強制轉換可能成功或失敗,具體取決於實際實現接口的類。 這只能在運行時發現。
如果你有一個實現Interface1
的類型,它也可以實現Interface2
。 因此編譯器不會責怪你,因為在運行時,強制轉換可能會成功。
這是因為JAVA支持多種接口實現。 由於我們可以有任意類型的任何類型(任何父類)可以實現一個接口,JVM設計是這樣的,直到運行時無法識別哪個類型正在傳遞到接口。所以可以放置任何接口ArryList
編譯器不知道這是行不通的:你可以有型接口2的實例也是類型接口1的(為前:類ImplementingClass實現接口1,接口2)。 然后演員會很好。
“使用兩個類而不是接口確實會產生編譯錯誤。”
在這種情況下,編譯器知道它不起作用,因此在這種情況下你會遇到編譯錯誤。
有可能,該子類的Interface1
可以是一個子類的Interface2
也。 因此,它不會給出編譯錯誤。
這不是一般問題。 JVM對於Interface1
和Interface2
之間的兼容性沒有任何“已知”。 所以你得到了ClassCastException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.