在Java中是否可以将泛型类型扩展到多个类?
我试图用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
字段
,方法
,要么是构造函数
)
我尝试了以下标题:
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)