为什么在Java中,必须在返回类型之前声明类型参数



在不介绍泛型的情况下,我将立即发布我的问题。为什么这是正确的:

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
}

综上所述,为什么我们可以在参数中使用通配符声明,而使用type参数我们必须在返回类型之前声明它?

有两个要点。

首先,正如@akuzminykh在对该问题的评论中所说,?通配符基本上只是告诉编译器";我不知道这会是什么,只是假设它可以是从这个类/接口kthxbye派生的任何东西;。它没有声明任何可以在方法中使用的参数,没有可以调用的标识符,什么都没有。然而,类型参数正是这样做的,如果您声明一个新的类型参数,那就与"不同了;呼叫";不需要声明的通配符。

其次,考虑如何为泛型类声明类型参数。你认为这足够吗?

public class Foo {
public T extends CharSequence getBar() {...}
}
public class Foo {
public <T extends CharSequence> getBar() {...}
}

不,这两个选项都不起作用。为了在类中使用泛型类型参数,必须将其与类型本身一起声明,而不是与使用它们的方法/字段一起声明。像这样:

public class Foo<T extends CharSequence> {
public T getBar() {...}
}

为了在方法中使用泛型类型参数,必须将其与方法本身或包含该方法的类型一起声明,而不是与使用它们的方法参数一起声明。

最新更新