是否可以将泛型类型扩展为Java中的多个类?

时间:2015-10-14 08:13:45

标签: java generics

我正在尝试用Java编写一个使用泛型参数的方法,我希望将其限制为三个可能的类之一(FieldMethod或{{1 }})。

我尝试过以下标题:

Constructor

但这样忽略了private static <T extends Field,Method,Constructor> T[] sort(T[] anArray) Method类型的通用参数。使用以下内容也会产生错误:

Constructor

是否可以在private static <T extends Field | Method | Constructor> T[] sort(T[] anArray) 中执行此类操作?

4 个答案:

答案 0 :(得分:5)

对于您的特定情况(如果您正在谈论反思特定类),您很幸运。

您可以使用AccessibleObject类。

private static <T extends AccessibleObject> T[] sort(T[] anArray)

您可能还会对Member界面感兴趣,具体取决于您的要求。

答案 1 :(得分:3)

无法使用或运算符(|)定义类型参数绑定。

但是,只能通过使用T运算符来限制类型参数&来扩展类和多个接口:

<T extends SomeClass & FirstInterface & SecondInterface>

答案 2 :(得分:2)

不,但您可以使用通用接口/超类,只需使用Object并检查方法内部或提供单独的重载。

请注意,A & B是可能的,即要求泛型类型实现这两种类型。您不能使用(即A | B),因为编译器不能/不会确定常见的超类型 - 如果它甚至存在于Object之外 - 因此你的实现不适用于任何类型,因为如果有疑问你将被传递错误的类型。

考虑一下:如果您被允许将T声明为T extends Field | Method,您将如何在代码中使用它?你真正知道的是,这两种类型都提供了Object的方法。

泛型旨在消除(可能失败的)强制转换的需要,以便访问特定类型的方法(即泛型类型的上限)。限制参数类型就是这样的结果,但并不是您希望使用它的主要目标。这就是重载的方法。

编辑:我刚刚阅读了Codebender的答案,这就是我在第一句中提到的:使用通用界面,或者就像这里的情况一样,使用超类。这可能是最好的方式。

答案 3 :(得分:1)

FieldConstructorMethod均来自Member。你可以这么做:

private static <T extends Member> T[] sort(T[] anArray)

指定一个可以匹配几个不相关类型之一的类型绑定是没有意义的。泛型的全部意义在于为编译器提供足够的信息来确定T类型可用的方法,因为我们并不确切知道T究竟是什么。如果它可以是三件事之一,编译器怎么可能知道应该允许哪些方法?