Java泛型 - 方法签名中的上界限制

8

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

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

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

在第二种情况下,我将无法在方法内直接引用该类型。这两种方法可以传递哪些类类型,是否有区别?


2
@prudhvi,“<T extends AbstractClass>”是一个(有界)类型参数,使整个声明成为通用方法。这与成为通用类的方法不同。 - John Bollinger
@JohnBollinger 我认为应该是 <T extends AbstractClass> myMethod(Class<T> clazz); 或者 void myMethod(Class<T> clazz); 我说得对吗? - Prudhvi
1
“我是对的吗?” 不,你不是。类型参数不能替换返回类型。 - Tom
1
@Tom 收到了,我今天学到了新东西。 - Prudhvi
3个回答

5

不,你提供的这两个方法签名兼容的参数类型是没有区别的。如果需要引用参数所表示的确切类型,我个人会使用带参数的版本,但如果不需要,则建议使用通配符版本。


2
在第一个示例中,您还可以返回T(或任何使用T进行参数化的类型:List<T>,Set<T>等),而无需进行强制转换。
<T extends AbstractClass> T myMethod(Class<T> clazz);

并将其用作以下方式:

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

1

这个问题已经在很多地方被问到了,特别是这里这里

这两个问题都主要涉及无界通配符和泛型类型,但同样的原则也适用于这里。我还建议阅读另一个问题的答案之一提供的链接(Angelika Langer - Java Generics FAQs)(放置在这里以便查看)。

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


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