泛型邊界 2 編譯器有點蠢

2021-08-26 18:18:16 字數 741 閱讀 3393

首先來看arraylist 的幾個api的定義:

顯然:indexof 、contains的入參是object, 而add的入參是泛型型別的引數。

再看一段demo:

public

class compilerintelligence

}

呼叫add時,add()引數就變成了 (? extends fruit),而在ide中提示的,其實是

capture of ? extends fruit ,也就是fruit或其子類型別的capture(英文中是「捕捉」的意思),而不是特定的乙個fruit或其子類型別。

其實呢:編譯器並不能搞清楚需要flist 到底要add (e e)哪個型別的e,所以任何型別的fruit都不接受。

這兩個api的引數是object,不涉及任何萬用字元,編譯器也允許這個呼叫。引數是object型別,說明根本就沒限制型別嘛,所以呼叫究竟安全與否就靠泛型類(比如arraylist)的設計者來保證了。

holder< ? extends fruit> holder 這個引用只能get(),不能set()。這是因為 這個引用的set()方法實際上set ( ? extends fruit ),意味著它可以使任何事物,但編譯器沒法驗證「任何事物」的型別安全性equals(object obj)方法沒毛病,這是因為它接收object型別而非泛型t型別的引數。所以,編譯器只關注傳進來和要返回的物件型別,不會分析**看中間有什麼操作。

Swift 4 1增強了泛型 編譯器和包管理器

swift 4.1發布正式版,它為swift包管理器和foundation帶來了新的語言特性 構建選項和增強功能。正如infoq之前報道的那樣,當swift 4.1在xcode 9.3 beta版本中初步可用時,語言級別最重要的新特性是條件一致性 conditional conformance 這一...

Swift 4 1增強了泛型 編譯器和包管理器

swift 4.1發布正式版,它為swift包管理器和foundation帶來了新的語言特性 構建選項和增強功能。正如infoq之前報道的那樣,當swift 4.1在xcode 9.3 beta版本中初步可用時,語言級別最重要的新特性是條件一致性 conditional conformance 這一...

Swift 4 1增強了泛型 編譯器和包管理器

swift 4.1發布正式版,它為swift包管理器和foundation帶來了新的語言特性 構建選項和增強功能。正如infoq之前報道的那樣,當swift 4.1在xcode 9.3 beta版本中初步可用時,語言級別最重要的新特性是條件一致性 conditional conformance 這一...