什么是静态 <T> List<T> methodName(List <? super T> input)?

16
我有下面的代码,但我对所有的泛型参数感到困惑。
public static <T> List<T> backwards (List<? super T> input) {  
       List<T> output = new ArrayList<T>();  
       return output;  
}

我理解的是我有一个名为backwards的公共方法,它创建了一个实现了List接口并返回该ArrayList的ArrayList。我的问题是,以下部分实际上对编译器说了什么......

static <T> List<T> backwards (List<? super T> input)

4
backwards жҺҘеҸ—дёҖдёӘжҹҗз§Қ зұ»еһӢ зҡ„еҲ—иЎЁпјҢиҜҘ зұ»еһӢ жҳҜ T зҡ„и¶…зұ»еһӢпјҲдҫӢеҰӮпјҢиҫ“е…ҘеҸҜд»ҘжҳҜ List<Object>пјүпјҢ并иҝ”еӣһдёҖдёӘ T зұ»еһӢзҡ„еҲ—иЎЁгҖӮ - user541686
感谢Mehrdad的解释。 - user1459497
input 会在 backwards 中被使用吗?我没有看到它在哪里被使用。 - Crazenezz
3个回答

47
你在告诉编译器:
<T>

我正在为这个方法声明一个任意类型T,每次调用该方法时它可以是任何东西(非原始类型)。

List<T>

这个方法将返回一个包含类型 T 元素的 List
List<? super T> input

这种方法将接受一个名为input的参数,它是包含类型为T或任何超类型的元素的List。例如,如果TInteger,则input可以是List<Integer>List<Number>List<Object>


6
public static List<T>相比,方法签名public static <T> List<T>的含义并未得到解释。 - 2rs2ts
2
@agarrett public static List<T> 没有声明类型参数,因此必须已经在声明类的泛型类型参数T的范围内。但是问题甚至没有提到这一点,所以我不明白你为什么要提出它。 - Paul Bellora
1
哦,他问到了他在那行代码中向编译器说了什么,所以我认为这很相关;而且他没有接受这个答案,但这可能只是我希望自己的问题得到回答而读错了。抱歉! - 2rs2ts

4

除了Paul的回答之外,那可能让它更清晰一些,如果您有一些在其定义中声明了通用参数的类,您可以编写像这样的通用方法:

public class SampleClass<T>{
  public static List<T> backwards (List<? super T> input)
}

否则,如果你的类没有声明泛型参数(或者你想定义额外的参数),那么你应该按照这种方式定义你的方法:

public class SampleClass{
    public static <T> List<T> backwards (List<? super T> input){...}
}

一个非常酷的解释! - Zekarias Taye Hirpo

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接