簡體   English   中英

Java泛型接口轉換

[英]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對於Interface1Interface2之間的兼容性沒有任何“已知”。 所以你得到了ClassCastException

暫無
暫無

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

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