在子类中参数化超类方法和非参数化(具体类型)方法



我有一个抽象超类ValueType和两个非抽象子类IntTypeDoubleType。如何在超类方法中定义类型,如下所示

public abstract class ValueType {
public abstract <T extends ValueType> T add(T other);
}

我允许编写具体类型(例如 子类方法中的public IntType add(IntType other)DoubleType add(DoubleType other)(

public class IntType extends ValueType {
private int val;
public IntType(int val){
this.val = val;
}
public int getVal(){
return this.val;
}
@Override
public IntType add(IntType other) {
return new IntType(this.val + other.getVal());
}
public class DoubleType extends ValueType {
private double val;
public DoubleType(double val){
this.val = val;
}
public double getVal(){
return this.val;
}
@Override
public DoubleType add(DoubleType other) {
return new DoubleType(this.val + other.getVal());
}

在上面的示例中,子类方法不会覆盖超类方法。

使抽象类本身泛型,而不仅仅是其方法。

将泛型类型<T extends ValueType>提升为类泛型参数。请注意,通过此操作,类ValueType也变为泛型,因此<T extends ValueType<T>>代替以避免原始类型:

public abstract class ValueType<T extends ValueType<T>> {
public abstract T add(T other);
}

然后,具体的子类从泛型类扩展并强制覆盖抽象方法(省略私有字段、getter 和 setter(:

public class IntType extends ValueType<IntType> {
@Override
public IntType add(IntType other) {
return new IntType(this.val + other.getVal());
}
}
public class DoubleType extends ValueType<DoubleType> {
@Override
public DoubleType add(DoubleType other) {
return new DoubleType(this.val + other.getVal());
}
}

顺便说一下,您有两个错别字:

  • return new IntType(this.value + other.getVal());应该使用this.val
  • return new DoubleType(this.value + other.getVal());也应该使用this.val

相关内容

最新更新