【发布时间】:2020-11-11 18:33:21
【问题描述】:
没有对泛型的任何介绍,我将立即发布我的问题。为什么这是正确的:
static<T extends Object> void m1(List<T> list){
//some code
}
这不是(不编译):
static void m2 (List<T extends Object> list){
//some code
}
请记住,我们可以在相同的方法中使用 通配符,这样编译得很好:
static void m2 (List<? extends Object> list){
//some code
}
总结一下,为什么我们可以在参数中使用通配符声明,而使用类型参数却必须在返回类型之前声明呢?
【问题讨论】:
-
假设您想定义一个类型并从同一方法返回该类型的对象。签名将是
static T <T extends Object> m1(List<T> list),但这没有意义,因为T将在定义之前使用。 -
因为编译器知道
?是什么意思,但它不知道T是什么意思。你必须声明T,就像你需要声明任何变量或方法一样。首先你必须声明它,然后你才能使用它。 -
如果你把
List<T>作为一个参数,没有迹象表明T是一个泛型类型参数而不是一个具体类型。 -
<? extends Object>不会尝试定义T或任何其他标识符。它只是告诉编译器“这个列表有一个特定的类型,但我不知道它是什么。” -
@Markus 将
?视为null。你不需要声明它,但T你需要。另请注意,您可以对T使用任何内容。你也可以写SomeType。在签名中使用<...>就是您为通用方法声明这样一个通用参数的方式。
标签: java generics wildcard type-parameter