java泛型和类型通配符,java – 泛型,类型参数和通配符
通用類型要了解的主要內容是它們不是協變的。
所以你可以這樣做:
final String string = "string";
final Object object = string;
以下將不會編譯:
final List strings = ...
final List objects = strings;
這是為了避免您規避泛型類型的情況:
final List strings = ...
final List objects = strings;
objects.add(1);
final String string = strings.get(0);
所以,一個個通過你的例子
1
您的通用方法采用列表< T>,您傳遞列表;這是(基本上)List< Object>。 T可以分配給對象類型,編譯器很高興。
2
您的通用方法相同,您傳遞列表>。 T可以分配給列表類型和編譯器再次開心。
3
這與基本相同,具有另一個嵌套級別。 T仍然是列表類型。
4
這里是一個小梨形狀,從上方來的地方在哪里。
您的通用方法采用List< List< T>。您傳遞列表>。現在,由于通用類型不是協變的,List不能分配給List< T>。
實際的編譯器錯誤(Java 8)是:
required: java.util.List> found:
java.util.List> reason: cannot infer
type-variable(s) T
(argument mismatch; java.util.List> cannot be converted to java.util.List>)
基本上,編譯器告訴你,由于必須推斷出List< T>的類型,它找不到要分配的T。嵌套在外部列表中。
讓我們再來一些細節:
列表與LT;?>是一些未知類型的列表 – 它可以是List< Integer>或List< String>;我們可以從Object獲取,但是我們不能添加。因為否則我們遇到了我提到的協方差問題。
列表與LT;列表與LT;?>>是某個未知類型的列表的列表 – 它可以是List< List< Integer>>或列表>。在情況1中,可以將T分配給對象,并且不允許在通配符列表上添加操作。在這種情況下,這不能完成 – 主要是因為沒有泛型構造來阻止添加到外部列表。
如果編譯器在第二種情況下將T分配給Object,則可以執行以下操作:
final List> list = ...
final List> wildcard = list;
wildcard.add(Arrays.asList("oops"));
因此,由于協方差,不可能分配List< List< Integer>>到任何其他通用列表安全。
總結
以上是生活随笔為你收集整理的java泛型和类型通配符,java – 泛型,类型参数和通配符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机盐城工学院和常熟理工,【选专业】这
- 下一篇: ll微信2下载安装_【兰苑文学】:陈振