作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我们考虑一下这段代码:
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/
COW 不是奶牛,是 Copy-On-Write 的缩写,这是一种是复制但也不完全是复制的技术。 一般来说复制就是创建出完全相同的两份,两份是独立的: 但是,有的时候复制这件事没多大必要
我是一名优秀的程序员,十分优秀!