有界类型参数

时间:2016-08-31 04:17:19

标签: java generics bounded-types

对不起,伙计们,这可能是一个天真的问题。

我对有界类型参数和通配符有点困惑。 <T extends String><? extends String>之间的区别是什么?

由于

2 个答案:

答案 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>用于已经通用的类,并将给定数据类型限制/限制到特定范围。