Java泛型类型号

Java泛型类型号,java,generics,numbers,Java,Generics,Numbers,我已经阅读了几页关于泛型方法的文章,对它们有了一些理解,但我仍然不理解它们。假设我有一个方法将两个数字相乘并返回乘积: public double multiply(SomeNumberVariableType x, SomeNumberVariableType y){ return x * y; } 如何使用有界泛型仅允许数字类型作为参数?也许这就是您的意图: public static <N extends Number> double multiply(N x, N

我已经阅读了几页关于泛型方法的文章,对它们有了一些理解,但我仍然不理解它们。假设我有一个方法将两个数字相乘并返回乘积:

public double multiply(SomeNumberVariableType x, SomeNumberVariableType y){
    return x * y;
}

如何使用有界泛型仅允许数字类型作为参数?

也许这就是您的意图:

public static <N extends Number> double multiply(N x, N y){
    return x.doubleValue() * y.doubleValue();
}

也许这就是你的意图:

public static <N extends Number> double multiply(N x, N y){
    return x.doubleValue() * y.doubleValue();
}
您可以通过编码
指定绑定到您的类型:

允许使用任意两个数字,如整数和长整数。

您可以通过编码指定绑定到您的类型:


它允许任何两个数字,例如整数和长整数。

一般来说,Java泛型不适合用于数学

在Java中:

  • 泛型只是对象
  • 对象没有数学运算符
看起来您可以对对象执行数学运算,因为您可以执行以下操作:

Integer a = 1;
Integer b = 2;
Integer c = a + b;
但这只是由于自动装箱。实际发生的是编译器用以下代码替换该代码:

Integer a = new Integer(1);
Integer b = new Integer(3);
Integer c = Integer.valueOf(a.intValue() + b.intValue());
对于泛型,您可以指定一个绑定,以便您的类型必须是Number或其子类型:

static <N extends Number> N multiply(N n1, N n2) {
    return n1 * n2; // but you cannot do this because the type is not known
                    // so the compiler cannot do autoboxing
}
除了泛型版本可以,例如,将BigDecimal作为参数,这当然不会提供可靠的结果(请参阅)。(两人都不会渴望这件事。)


如果你真的下定决心了,你可以编写自己的数字类并使用多态性。否则,请使用重载或(最好)只使用一种类型。

一般来说,Java泛型不适用于数学

在Java中:

  • 泛型只是对象
  • 对象没有数学运算符
看起来您可以对对象执行数学运算,因为您可以执行以下操作:

Integer a = 1;
Integer b = 2;
Integer c = a + b;
但这只是由于自动装箱。实际发生的是编译器用以下代码替换该代码:

Integer a = new Integer(1);
Integer b = new Integer(3);
Integer c = Integer.valueOf(a.intValue() + b.intValue());
对于泛型,您可以指定一个绑定,以便您的类型必须是Number或其子类型:

static <N extends Number> N multiply(N n1, N n2) {
    return n1 * n2; // but you cannot do this because the type is not known
                    // so the compiler cannot do autoboxing
}
除了泛型版本可以,例如,将BigDecimal作为参数,这当然不会提供可靠的结果(请参阅)。(两人都不会渴望这件事。)


如果你真的下定决心了,你可以编写自己的数字类并使用多态性。否则,请使用重载或(最好)只使用一种类型。

乘法运算符的每个操作数的类型必须是可转换(§5.1.8)为基元数字类型的类型,否则会发生编译时错误。
要将哪些数字类型用作参数?我认为不能使用有界泛型本身,但这似乎是一个可以通过多态性解决的问题。
乘法运算符的每个操作数的类型必须是可转换(§5.1.8)为原始数字类型的类型,或者发生编译时错误。
您希望使用什么数字类型作为参数?我不认为可以使用有界泛型本身,但这似乎是一个可以通过多态性解决的问题。当方法被调用时,我希望成为一个在参数中使用int变量或双变量的函数。这只允许我使用一个数字object@Dando18java泛型仅是对象。请考虑我在编辑的答案中关于参数类型相等的附加注释。当该方法被调用时,我想在参数中使用int变量或双变量。这只允许我使用一个数字object@Dando18java泛型仅是对象。请考虑我在编辑的答案中关于参数类型相等的附加注释。我赞成泛型仅与对象相关的声明。我赞成泛型仅与对象相关的声明。
static double multiply(double n1, double n2) {
    return n1 * n2;
}