Sam*_*uel 5 java generics wildcard set
我读过<?>
的内容与完全相同<? extends Object>
。那有什么区别:
Set<?>
Set<Object>
Set
我尝试将String.class
和添加MyClass.class
到所有这些集合中,但是在第二种情况下,它无法编译。
我没有得到的另一个例子是:
Set<Class>
Set<Class<?>>
在我看来,它们是相同的,但是如果我有一个可以返回的方法Set<Class<?>>
,则无法将其返回值分配给type变量Set<Class>
。
很抱歉,如果这是重复的,但是我已经阅读了所有其他文章,并且示例很少,但我仍然不明白。
使用Set<?>
,我可以使用我想要的任何类型,例如 :Set<?> s =new HashSet<Intger>()
或Set<?> s =new HashSet<String>()
.Since,我?
可以引用任何我不允许放入null
集合中以外的任何内容,并且我将Object
退出集合。
Set<Object>
说我只能Object
为 ex分配类型:Set<Object> s =new HashSet<Object>()
但不能Set<Object> s =new HashSet<String>()
。在这种情况下,我可以添加任何类型,因为Object
是超级基本类型,但我会Object
退出集合。
Set
是基本的原始类型,您可以添加任何内容并从中获取Object
类型。
Set<Class>
不同于Set<Class<?>>
。第一个说“我是一组非特定Class
类型”,而第二个说“我是一组特定Class
类型但不知道是哪一个”。
Set
and Class
、and ,进而扩展为Set<Class>
)是一种不好的做法,应不惜一切代价避免。如果一个类是泛型的,则始终使用其泛型形式。如果您的 IDE/编译器在您尝试使用它们时没有给您很大的警告,那么您没有启用足够的警告。Set<?>
是一组几乎任何东西的集合,但明确定义为一组没有任何特别内容的集合,因此它实际上不可用。不要这样做。因此,您永远不应该尝试“将返回值[返回Set<Class<?>>
]类型的变量分配给Set<Class>
”,因为您永远不应该拥有类型为 的变量Set<Class>
,而应该只拥有类型为 的变量Set<Class<?>>
。
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"
Run Code Online (Sandbox Code Playgroud)