对不起,伙计们,这可能是一个天真的问题。
我对有界类型参数和通配符有点困惑。 <T extends String>
和<? extends String>
之间的区别是什么?
由于
答案 0 :(得分:1)
第二个基本上意味着:你真的不关心实际的类型。你只关心它会扩展String。
换句话说:如果您的代码不需要使用&#34; T&#34;任何地方;然后你可以通过&#34来更清楚地表达你的意图;完全没有提到类型名称T&#34;。
对于更多技术背景,最好的资源之一是Angelika Langer的工作。
答案 1 :(得分:1)
我认为你在这里混淆了一些东西。
声明泛型类时使用 <T extends String>
。
<? extends String>
用于已经通用的类的实例。
让我们从集合框架中获取接口“List”,例如:
List <E>
与List <E extends Object>
相同,这意味着您可以将列表与从Object继承的每种数据类型一起使用。
通配符<?>
只能用于已经通用的类。以List<E>.
为例,假设您有一个使用List的方法,但您不希望允许从Object继承的每个数据类型。
您可以使用不同的数据类型,如:
public void myMethod(List<String> list){
//…
}
但您也可以使用一系列您想要允许的数据类型:
public void myMethod(List<? extends String> list{
//..
}
在第二个例子中,您可以使用与字符串协变的每个数据类型,即字符串的子节点。
<强> Tldr:强>
Bounds <T extends String>
用于声明泛型类支持的数据类型范围。
通配符<? extends String>
用于已经通用的类,并将给定数据类型限制/限制到特定范围。