簡體   English   中英

Java泛型中的問號

[英]Question mark in Java generics

我讀過<?><? extends Object>完全相同<? extends Object> <? extends Object> 然后有什么區別:

  1. Set<?>
  2. Set<Object>
  3. Set

我已經嘗試將String.classMyClass.class添加到所有這些集合中,但在第二種情況下它不會編譯。

另一個我沒有得到的例子是:

  1. Set<Class>
  2. Set<Class<?>>

對我來說,似乎它們是相同的,但如果我有一個返回Set<Class<?>> ,我不能將它的返回值賦給Set<Class>類型的變量。

我很抱歉,如果這是重復的,但我已閱讀所有其他帖子,並且很少有例子,我仍然無法理解。

使用Set<?> ,我可以使用我想要的任何類型: Set<?> s =new HashSet<Intger>()Set<?> s =new HashSet<String>() 。因為,我可以做? 引用任何我不允許在集合中放置除null之外的任何東西,我將從集合中獲取Object

Set<Object>表示我只能為ex分配類型ObjectSet<Object> s =new HashSet<Object>()但不是Set<Object> s =new HashSet<String>() 。在這種情況下我可以添加任何type因為Object是超級基類型,但我將從集合中獲取Object

Set是基本的原始類型,您可以添加任何內容並從中獲取Object類型。

Set<Class>Set<Class<?>> 。第一個說“我是一組非特定Class類型”,而第二個說“我是一組特定Class類但不知道哪一個”。

  1. 使用沒有通用參數的泛型類(如SetClass ,以及擴展名為Set<Class> )是一種不好的做法,不惜一切代價避免使用。 如果類是通用的,請始終使用其通用形式。 如果您的IDE /編譯器在嘗試使用它們時沒有給您大量警告,那么您沒有啟用足夠的警告。

Austin Powers  - 我注意到你忽略了編譯器警告;我也喜歡生活危險。

  1. 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.

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