我正在尝试用Java编写一个使用泛型参数的方法,我希望将其限制为三个可能的类之一(Field
,Method
或{{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)
中执行此类操作?
答案 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)
Field
,Constructor
和Method
均来自Member
。你可以这么做:
private static <T extends Member> T[] sort(T[] anArray)
指定一个可以匹配几个不相关类型之一的类型绑定是没有意义的。泛型的全部意义在于为编译器提供足够的信息来确定T
类型可用的方法,因为我们并不确切知道T
究竟是什么。如果它可以是三件事之一,编译器怎么可能知道应该允许哪些方法?