Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何允许泛型类方法仅由某些类型的参数执行?_Java_Generics_Polymorphism - Fatal编程技术网

Java 如何允许泛型类方法仅由某些类型的参数执行?

Java 如何允许泛型类方法仅由某些类型的参数执行?,java,generics,polymorphism,Java,Generics,Polymorphism,我试图向现有类BinaryTree添加一个方法,以简单地添加树中所有元素的值。问题在于,作为一个泛型类,并不是所有在创建树时可以发送的类型都可以添加。我的意思是,例如,尝试添加classpeople的值没有任何意义 所以我的问题是,如何创建一个只允许T成为特定类型的方法public T addallegements(),在这种情况下,只允许添加它的值的类型,比如Integer,Float,Long,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点 顺便说一句,这似乎是一个不必

我试图向现有类
BinaryTree
添加一个方法,以简单地添加树中所有元素的值。问题在于,作为一个泛型类,并不是所有在创建树时可以发送的类型都可以添加。我的意思是,例如,尝试添加class
people
的值没有任何意义

所以我的问题是,如何创建一个只允许
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
T
addAllegements()
只允许T是一种特定的类型,在这种情况下,只允许添加它的值的类型,比如
int
float
long
,等等?我想必须要有某种数字接口,或者语言提供的某种声明才能做到这一点

你在找我

如果类是泛型的,那么您的声明将如下所示:

public BinaryTree<T extends Number> {
  // ...
}
公共二进制树{
// ...
}
或者,如果您只想使方法通用:

public <T extends Number> T addAllElements() {
  // ...
}
public T addallements(){
// ...
}
也就是说,无论是好是坏,
Number
并没有根据方法定义算术运算。据我所知,没有这样的内置类型

请注意,您列出的类型都是原语,这意味着它们与泛型完全不兼容。
Number
的子类型(以及可以与泛型一起使用的类型)都将是包装类型:
Integer
Float
Long
,等等

所以我的问题是,我如何使一个方法
public
T
addAllegements()
只允许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