gpt4 book ai didi

java - 实现逆变参数的泛型类型

转载 作者:行者123 更新时间:2023-12-01 07:43:20 24 4
gpt4 key购买 nike

让我们考虑一下这段代码:

public interface Number {
public Number plus(Number n);
}

public class Complex implements Number {
private double re, im;

public Complex(double re, double im) {
this.re = re;
this.im = im;
}

@Override
public Complex plus(Complex c) {
return new Complex(this.re + c.re, this.im + this.im);
}
}

它不会编译,因为如果Complex.plus()重写Number.plus(),它的参数必须与重写的方法完全相同。我考虑过对数字可以与之交互的对象类型使用泛型,但它会产生非常不干净的代码,并且未参数化地使用 Number 和冗余:

public interface Number<T extends Number> {
public T plus(T n);
}

public class Complex implements Number<Complex> {
private double re, im;

public Complex(double re, double im) {
this.re = re;
this.im = im;
}

@Override
public Complex plus(Complex c) {
return new Complex(this.re + c.re, this.im + this.im);
}
}

有没有更优雅的方法来实现这一点?

感谢您的帮助。

最佳答案

简单修复:使类型参数自限:

public interface Number<T extends Number<T>> {

(然后小指发誓,您只会定义一个为自己实现接口(interface)的类,例如 class Self implements Number<Self> )

<小时/>

但是,我会在没有 Number 的情况下执行此操作接口(interface),至少在 plus 方面方法。除非您可以有意义地添加 Number 的不同子类型,在公共(public)接口(interface)中拥有这样的方法显然没有任何作用。

考虑一下为什么标准 Number 没有定义算术方法界面。

相反,没有 plus Complex中的“运算符”类之一:使用标准 BinaryOperator为特定类型定义加号运算符的接口(interface):

BinaryOperator<Complex> complexPlus = (a, b) -> new Complex(a.re + b.re, a.im + b.im);
BinaryOperator<Integer> integerPlus = (a, b) -> a + b; // Or Integer::sum.

然后应用这些:

Complex complexSum = complexPlus.apply(firstComplex, secondComplex);
Integer integerSum = integerPlus.apply(firstInt, secondInt);

关于java - 实现逆变参数的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60866155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com