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

java-类属性类型随继承而更改

郎思远
2023-03-14

我有一个MyClass,它的属性类型为MyAttribute。该类由MySubClass继承,其属性类型为MySubAttribute。MySubAttribute是MyAttribute的子类:

class MyClass {
    MyAttribute myAttribute;
    MyClass(MyAttribute myAttribute) {
        this.myAttribute = myAttribute;
    }

    MyAttribute getMyAttribute() {
        return myAttribute;
    }
}

class MySubClass extends MyClass {
    MySubClass(MySubAttribute mySubAttribute) {
        super(mySubAttribute);
    }
}


class MyAttribute {
    void doSomething() {
    }
}

class MySubAttribute extends MyAttribute {
    @Override
    void doSomething() {
        super.doSomething();
    }
    void doSomethingElse() {
    }
}

现在假设我有以下代码:

mySubClass.getMyAttribute();

如何生成MySubAttribute类型的返回值?

共有3个答案

田冥夜
2023-03-14

通常的解决方案是泛型:

class MyClass<A extends MyAttribute> {
    A myAttribute;
    MyClass(A myAttribute) {
        this.myAttribute = myAttribute;
    }

    A getMyAttribute() {
        return myAttribute;
    }
}

class MySubClass extends MyClass<MySubAttribute> {

或者,您可以让MySubClass使用更窄的返回类型覆盖getter:

    @Override
    MySubAttribute getMyAttribute() {
        // we know the cast succeeds because we have set a MySubAttribute in the constructor
        return (MySubAttribute) myAttribute; 
    }

通用解决方案提供了对实现类更好的编译时检查,并允许调用方通过编写MyClass来引用属性的类型,即使调用方不知道MyClass的子类型

后凯捷
2023-03-14

您可以将这样的内容添加到MySubClass

@Override
MySubAttribute getMyAttribute() {
    return new MySubAttribute();
}
程仲卿
2023-03-14

您应该看看Java泛型。

此外,您不再需要定义MySubClass,除非您想向其添加额外的方法或属性。

class MyClass<T extends MyAttribute> {
  T myAttribute;
  MyClass(T myAttribute) {
    this.myAttribute = myAttribute;
  }

  T getMyAttribute() {
    return myAttribute;
  }
}


class MyAttribute {
  void doSomething() {
    System.out.println("Doing something...");
  }
}

class MySubAttribute extends MyAttribute {
  void doSomethingElse() {
    System.out.println("Doing something else...");
  }
}

// You would instantiate `mySubClass` as follows
MyClass<MySubAttribute> mySubClass = new MyClass<>(new MySubAttribute());
mySubClass.getMyAttribute().doSomethingElse();
 类似资料:
  • > RDF/OWL中继承的含义是什么? 是否可以用OWL/RDF构造面向对象语言类型的类-子类继承? 请考虑以下示例。是否“讲师”和“学生”的所有属性都将提供给“人”类? 如果有人提供给我一个很好的例子,这将是非常有帮助的答案。提前谢谢你。

  • 我用Python编写了一个类,这样就可以从中继承。它的逻辑按预期工作,但我可以从名为的派生类中存在的状态访问属性。 生成以下错误: state_machine.py main.py

  • 我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。 有三个文件: 1. Person.java-基类2. Student.java-派生的Person.java3. Family.java-不太确定,我认为这是它自己的基类 人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equal

  • 我在Hibernate中有道传承,下面是代码: 用户DAO: 我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。 用户DAO: 客户道: 销售DAO: 我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出

  • 我在挣扎。 当扩展一个类时,我可以很容易地向它添加一些新属性。 但是,当我扩展基类时,如果我想向基类的对象(简单对象的属性)添加新属性,该怎么办? 下面是一个带有一些代码的示例。 基类 派生类 现在,正如您可以从行内注释中看到的,这将激怒TypeScript。但这在JavaScript中工作。那么,实现这一目标的正确方法是什么呢?如果没有,问题是在我的代码模式本身吗?什么模式适合这个问题? 也许您

  • 类继承是一个类扩展另一个类的一种方式。 因此,我们可以在现有功能之上创建新功能。 “extends” 关键字 假设我们有 class Animal: class Animal { constructor(name) { this.speed = 0; this.name = name; } run(speed) { this.speed = speed;