Java 如何允许泛型类方法仅由某些类型的参数执行?
我试图向现有类Java 如何允许泛型类方法仅由某些类型的参数执行?,java,generics,polymorphism,Java,Generics,Polymorphism,我试图向现有类BinaryTree添加一个方法,以简单地添加树中所有元素的值。问题在于,作为一个泛型类,并不是所有在创建树时可以发送的类型都可以添加。我的意思是,例如,尝试添加classpeople的值没有任何意义 所以我的问题是,如何创建一个只允许T成为特定类型的方法public T addallegements(),在这种情况下,只允许添加它的值的类型,比如Integer,Float,Long,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点 顺便说一句,这似乎是一个不必
BinaryTree
添加一个方法,以简单地添加树中所有元素的值。问题在于,作为一个泛型类,并不是所有在创建树时可以发送的类型都可以添加。我的意思是,例如,尝试添加classpeople
的值没有任何意义
所以我的问题是,如何创建一个只允许T
成为特定类型的方法public T addallegements()
,在这种情况下,只允许添加它的值的类型,比如Integer
,Float
,Long
,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点
顺便说一句,这似乎是一个不必创建子类的解决方案,以防它在任何方面都有帮助,因为我被要求解决一个类似的问题,并且说明说该方法必须在同一个类中
为了更清楚,我会问另一个问题,因为我认为他们都有相同的答案
我发现java.util.Arrays
类中的sort()
方法可以被类使用,如果类实现了接口Comparable
。所以如果我有一门课,让我们说
public class People {
implements Comparable<People>
private String name;
public int compareTo(People o) {
...
}
...
}
公共阶层人士{
实现可比性
私有字符串名称;
公共内部比较(人员o){
...
}
...
}
这个类可以通过数组类中的sort()
方法进行排序,但是如果这个类不能实现可比较的接口,它就不能。那么,是什么在数组类定义中设置了此限制?这就是我要解决的第一个问题吗
所以我的问题是,我如何使一个方法public
TaddAllegements()
只允许T是一种特定的类型,在这种情况下,只允许添加它的值的类型,比如int
,float
,long
,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点
你在找我
如果类是泛型的,那么您的声明将如下所示:
public BinaryTree<T extends Number> {
// ...
}
公共二进制树{
// ...
}
或者,如果您只想使方法通用:
public <T extends Number> T addAllElements() {
// ...
}
public T addallements(){
// ...
}
也就是说,无论是好是坏,Number
并没有根据方法定义算术运算。据我所知,没有这样的内置类型
请注意,您列出的类型都是原语,这意味着它们与泛型完全不兼容。Number
的子类型(以及可以与泛型一起使用的类型)都将是包装类型:Integer
、Float
、Long
,等等
所以我的问题是,我如何使一个方法public
TaddAllegements()
只允许T是一种特定的类型,在这种情况下,只允许添加它的值的类型,比如int
,float
,long
,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点
你在找我
如果类是泛型的,那么您的声明将如下所示:
public BinaryTree<T extends Number> {
// ...
}
公共二进制树{
// ...
}
或者,如果您只想使方法通用:
public <T extends Number> T addAllElements() {
// ...
}
public T addallements(){
// ...
}
也就是说,无论是好是坏,Number
并没有根据方法定义算术运算。据我所知,没有这样的内置类型
请注意,您列出的类型都是原语,这意味着它们与泛型完全不兼容。Number
的子类型(以及可以与泛型一起使用的类型)都将是包装类型:Integer
、Float
、Long
,等等。您的示例是相关的,但它们不相同
首先要解决后一个问题,使用特定签名的array.sort
要求事物具有可比性的原因是它需要根据自然顺序对它们进行排序。您可以向该方法提供另一个签名,它允许您将自定义的比较器传递给它,以便根据您喜欢的类的任何其他属性进行排序
对于您主要关心的问题,您需要有一个上限泛型,特别是类型T extends Number
的泛型。原因是Number
是所有数字包装类的父类,以及BigDecimal
和biginger
在你做这件事之前,有两件事你要确定:
- 您的泛型类型已在类级别绑定。因为我们处理的是一棵树,所以在整个过程中使用非齐次数据是没有意义的
- 您根据特定的数据类型(
int
、long
、或double
)进行了数学运算
然后,您将声明您的方法如下:
您可以使用:intValue
、longValue
和doubleValue
作为各自的方法
您不能简单地返回t
,因为您不能保证返回的是什么类型的Number
,或者t
具体绑定到什么(它不能是Number
,因为它是一个抽象类,所以是一个非包容的上限)。您的示例是相关的,但它们不相同
首先要解决后一个问题,Arrays.sort