在Java中是否可以将泛型类型扩展到多个类?

在Java中是否可以将泛型类型扩展到多个类?,java,generics,Java,Generics,我试图用Java编写一个使用泛型参数的方法,我想将其限制为三个可能的类(要么是字段,方法,要么是构造函数) 我尝试了以下标题: private static <T extends Field,Method,Constructor> T[] sort(T[] anArray) 是否可以在Java中执行此操作?类型参数绑定不能使用or运算符(|)定义 但是,通过使用和运算符,只能将类型参数T限制为扩展一个类和多个接口: <T extends SomeClass & Fir

我试图用Java编写一个使用泛型参数的方法,我想将其限制为三个可能的类(要么是
字段
方法
,要么是
构造函数

我尝试了以下标题:

private static <T extends Field,Method,Constructor> T[] sort(T[] anArray)

是否可以在
Java
中执行此操作?

类型参数绑定不能使用or运算符(
|
)定义

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

<T extends SomeClass & FirstInterface & SecondInterface>

否,但您可以使用公共接口/超类,只需使用
对象
并检查方法内部或提供单独的重载

请注意,
A&B
是可能的,即要求泛型类型实现这两种类型。您不能使用or(即,
A | B
),因为编译器不能/不会确定一个通用的超类型-如果它甚至存在于
对象
之外-因此您的实现不能在任何类型上工作,因为如果有疑问,您将通过错误的类型

想想看:如果允许您将
T
声明为
T扩展字段|方法
,您将如何在代码中使用它?您真正知道的是,这两种类型都提供了
Object
的方法

泛型意味着为了访问特定类型的方法(即泛型类型的上限),不需要(可能失败的)强制转换。限制参数类型是这样做的结果,但并不是您使用它的主要目的。这就是方法重载的作用

编辑:我刚刚读了Codebender的答案,这就是我在第一句话中提到的:使用公共接口,或者像这里一样,使用超级类。这可能是最好的方法。

对于您的特定情况(如果您谈论的是特定于反射的类),您很幸运

你可以使用这个类

私有静态T[]排序(T[]数组)

您可能还对接口感兴趣,具体取决于您的需求。

字段
构造函数
方法
都继承自
成员
。你可以这样做:

private static <T extends Member> T[] sort(T[] anArray)
私有静态T[]排序(T[]数组)

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

只是为了澄清:我们正在谈论
java.reflect.Field
java.reflect.Method
java.reflect.Constructor
,不是吗?是的。更具体地说,该方法应该通过比较这些类的名称对这些类的数组进行排序(使用“java.lang.reflect”中这些类的“getName()”方法)。这就是为什么我需要将类型限制为这三个类,因为并非所有类都有“getName”方法。显然,正如Codebender提到的,使用“extends Member”正是我所需要的!尽管如果Java提供了一种不必使用超类/接口就可以做到这一点的方法,那就太酷了。
private static <T extends AccessibleObject> T[] sort(T[] anArray)
private static <T extends Member> T[] sort(T[] anArray)