Java Generics - 方法签名的上限

时间:2015-04-20 18:20:07

标签: java generics

我有一个方法,我想接受必须扩展抽象类的类类型。有什么区别

<T extends AbstractClass> void myMethod(Class<T> clazz);

void myMethod(Class<? extends AbstractClass> clazz);

在第二种情况下,我无法直接引用方法内部的类型。可以将哪些类类型传递给这两种方法有什么区别吗?

3 个答案:

答案 0 :(得分:5)

不,与您提供的两个方法签名兼容的参数类型之间没有区别。就个人而言,如果我需要引用参数表示的确切类型,我会使用参数化版本,否则我会使用通配符版本。

答案 1 :(得分:2)

在第一个中你也可以返回T(或任何用T:List&lt; T&gt;参数化,Set&lt; T&gt;等等......)的类型,而无需投射它

<T extends AbstractClass> T myMethod(Class<T> clazz);

并将其用作:

Subclass parameterInstance =... 
Subclass i1 = myMethod(parameterInstance.getClass());

答案 2 :(得分:1)

许多地方都提到了这个问题,特别是herehere

这两个问题主要涉及无界通配符和泛型类型,但这里适用相同的原则。我还建议阅读其中一个答案提供的其中一个链接(Angelika Langer - Java Generics常见问题解答)(方便放置here)。

虽然在您的具体情况下没有区别,但差异仅仅在于如何在内部(在方法内)处理类型数据。用似乎最能描述你的目的去做。如果您正在处理未知类型的数据,并且您需要在方法中特定使用特定输入类型,则需要使用泛型方法。另一方面,如果你没有并且只需要将所有输入数据视为边界类型(例如,在你的情况下为AbstractClass)就足够了,那么你可以使用有界通配符方法。