我有一个方法,我想接受必须扩展抽象类的类类型。有什么区别
<T extends AbstractClass> void myMethod(Class<T> clazz);
和
void myMethod(Class<? extends AbstractClass> clazz);
?
在第二种情况下,我无法直接引用方法内部的类型。可以将哪些类类型传递给这两种方法有什么区别吗?
答案 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)
这两个问题主要涉及无界通配符和泛型类型,但这里适用相同的原则。我还建议阅读其中一个答案提供的其中一个链接(Angelika Langer - Java Generics常见问题解答)(方便放置here)。
虽然在您的具体情况下没有区别,但差异仅仅在于如何在内部(在方法内)处理类型数据。用似乎最能描述你的目的去做。如果您正在处理未知类型的数据,并且您需要在方法中特定使用特定输入类型,则需要使用泛型方法。另一方面,如果你没有并且只需要将所有输入数据视为边界类型(例如,在你的情况下为AbstractClass
)就足够了,那么你可以使用有界通配符方法。