[英]Question mark in Java generics
我讀過<?>
和<? extends Object>
完全相同<? extends Object>
<? extends Object>
。 然后有什么區別:
Set<?>
Set<Object>
Set
我已經嘗試將String.class
和MyClass.class
添加到所有這些集合中,但在第二種情況下它不會編譯。
另一個我沒有得到的例子是:
Set<Class>
Set<Class<?>>
對我來說,似乎它們是相同的,但如果我有一個返回Set<Class<?>>
,我不能將它的返回值賦給Set<Class>
類型的變量。
我很抱歉,如果這是重復的,但我已閱讀所有其他帖子,並且很少有例子,我仍然無法理解。
使用Set<?>
,我可以使用我想要的任何類型: Set<?> s =new HashSet<Intger>()
或Set<?> s =new HashSet<String>()
。因為,我可以做?
引用任何我不允許在集合中放置除null
之外的任何東西,我將從集合中獲取Object
。
Set<Object>
表示我只能為ex分配類型Object
: Set<Object> s =new HashSet<Object>()
但不是Set<Object> s =new HashSet<String>()
。在這種情況下我可以添加任何type因為Object
是超級基類型,但我將從集合中獲取Object
。
Set
是基本的原始類型,您可以添加任何內容並從中獲取Object
類型。
Set<Class>
與Set<Class<?>>
。第一個說“我是一組非特定Class
類型”,而第二個說“我是一組特定Class
類但不知道哪一個”。
Set
和Class
,以及擴展名為Set<Class>
)是一種不好的做法,不惜一切代價避免使用。 如果類是通用的,請始終使用其通用形式。 如果您的IDE /編譯器在嘗試使用它們時沒有給您大量警告,那么您沒有啟用足夠的警告。 Set<?>
是幾乎任何東西的集合,但明確地定義為一組沒有特別的東西,所以它實際上是不可用的。 不要這樣做。 所以,你永遠不應該嘗試“將[返回Set<Class<?>>
]的方法的返回值賦給Set<Class>
類型的變量,因為你永遠不應該有一個類型為Set<Class>
的變量Set<Class>
,您應該只有Set<Class<?>>
類型的變量。
更好的是,嘗試使用Set<Class<? extends MyClass>>
類型的變量Set<Class<? extends MyClass>>
Set<Class<? extends MyClass>>
如果適用於您的情況。 越具體,越好。
另外,請注意以下事項:
//invalid (gives errors)
Set<?> foo1 = new HashSet<>();
foo1.add( String.class ); //error: cannot convert to capture<?>
foo1.add( Generics2.class ); //error: cannot convert to capture<?>
//perfectly fine, though lame (don't use `Object`, use something specific)
Set<Object> foo2 = new HashSet<>();
foo2.add( String.class );
foo2.add( Generics2.class );
//invalid (gives warnings, in my opinion it should give errors.)
Set foo3 = new HashSet<>(); //warning "raw use of parameterized class 'foo3'"
foo3.add( String.class ); //warning "unchecked call to member of raw type"
foo3.add( Generics2.class ); //warning "unchecked call to member of raw type"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.