当前位置: 首页 > 知识库问答 >
问题:

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

傅高逸
2023-03-14

我有一个抽象超类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());
}

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

共有1个答案

虞承泽
2023-03-14

使抽象类本身泛型,而不仅仅是它的方法

提升泛型类型

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());
    }
}

顺便说一下,你有两个打字错误:

  • 返回新的intType(this.valueother.getVal());应该使用this.val
  • 返回新的DoubleType(this.valueother.getVal());也应该使用this.val

 类似资料:
  • 问题内容: 请考虑以下情况: 现在,我想定义一个扩展“动物”类的“鸟”类,以确保当鸟吃时,它只吃BirdFeed。 一种解决方案是指定一种合同,其中“ eat”的调用者必须传递适当提要的实例。 将参数的责任委托给调用者是否可以接受?如何强制调用者传递参数的特殊化?有替代设计解决方案吗? 问题答案: 您需要向该类添加类型变量: 然后,您可以将子类声明为需要特定类型的:

  • 我有一个名为的超级类,我有3个子类,分别是,和。 在每个子类中,我都有私有参数,和。 我想在 类中创建一个名为 的方法,该方法从 中删除 1 并将 10 添加到中,以便我可以在 main 方法中调用它们时将该方法应用于所有子类。但是如何将私有参数从子类获取到超类中呢? 我不能在超类中声明它们,因为每个子类都有自己的默认启动参数,这些参数应该在游戏期间进行。

  • 我面临泛型的问题。 下面是我使用泛型的一个类: 在这里,我们的类:使用进行参数化。 我想在我们的一种方法中指定类型,如下所示: 但是,我遇到以下编译器错误:

  • 问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放

  • 在java中,我们可以缩小返回类型和throws异常类型(甚至删除throws子句): 但是,参数类型呢(如果A采用< code>T,那么为什么B不采用< code >?超级T)如: 让我们考虑一下我认为完全符合逻辑的这段代码: 所以我要说的是,在使用的代码上下文中仍然有效。

  • 问题内容: 鉴于: 假设我想通过反射调用方法,将ArrayList作为参数传递给: 第3行将抛出异常,因为myList的运行时类型是ArrayList,而不是List。 有没有一种很好的通用方法可以不需要A类的参数类型知识? 问题答案: 如果您知道类型为,则将其用作参数。 如果您事先不知道类型,请想象您有: 如果有任何自动方式,反射应调用哪种方法? 如果需要,可以使用或,但要视情况而定。 您可以在