将超类传递到需要子类的方法中

用户名

好的,虽然我试图找到一个解释问题的标题,但我可能不得不对其进行扩展。

最近我实现了一个小程序,将用于控制磁带库。知道它必须使用多种不同类型的磁带库,因此开发了以下设计。

interface Tapelibrary<T extends TapeDrive> {
    List<T> getListofDrives();
    void doSomethingWithDrive(T d);
}

class SpecificTapeLibrary implements Tapelibrary<HPDrive> {
    private List<HPDrive> driveList;

    SpecificTapeLibrary() {
        driveList.add(new HPDrive());
        driveList.add(new HPDrive());
        driveList.add(new HPDrive());
    }

    @Override
    public List<HPDrive> getListofDrives() {
      return driveList;
    }

    @Override
    public void doSomethingWithDrive(HPDrive d) {
       d.doSomethingHPspecific();
    }
}

abstract class TapeDrive {
    void doSomething() {
    }
}

class HPDrive extends TapeDrive {
    void doSomethingHPspecific() {
    }
}

正确的磁带库由工厂根据命令行参数确定。

public static void main(String[] args) {
    Tapelibrary<? extends TapeDrive> t = new TapeLibraryFabric().get();
    List<? extends TapeDrive> listOfDrives = t.getListofDrives();

    // the user selects a drive by using a small UI or something
    TapeDrive selectedDrive = listOfDrives.get(0);

    t.doSomethingWithDrive(selectedDrive); // compiler error
}

这确实有意义,因为编译器必须将父类型 TapeDrive 显式转换为子类型 HPDrive,这是SpecificTapeLibrary 中的 doSomethingWithDrive(HPDrive) 方法所期望的

这将如何以好的 oop 方式解决?我最终没有在 doSomethingWithDrive 方法中使用泛型和强制转换(如此处所建议的:如何将子类传递到需要超级类作为参数的方法中)。但这不可能是最佳解决方案。

在写这篇文章时,另一个解决方案突然出现在我的脑海中,它更清晰。DriveSelector 类封装了选择过程。

class DriveSelector {
    <T> T selectDrive(List<T> inputList) {
        // give the user an UI or something to select a drive 
        return inputList.get(0);
    }
}

// the tape library then uses the selector
public void doSomethingWithSelectedDrive(DriveSelector selector) {
     HPDrive t = selector.selectDrive(driveList);
     t.doSomethingHPspecific();
}

还有其他想法吗?

安迪·特纳

在通用方法中完成所有工作:

static <T extends TapeDrive> void doStuff(Tapelibrary<T> t) {
  List<T> listOfDrives = t.getListofDrives();

  // the user selects a drive by using a small UI or something
  T selectedDrive = listOfDrives.get(0);

  t.doSomethingWithDrive(selectedDrive);
}

然后从您的主要方法调用它:

Tapelibrary<? extends TapeDrive> t = new TapeLibraryFabric().get();
doStuff(t);

Ideone demo

它的工作方式是删除所有通配符 - 关于通配符的事情是编译器将每个通配符视为不同的,即使值是从单个通用实例派生的。通过像这样将东西放入泛型方法中,您可以让编译器知道所有的Ts 都是相同的类型——因此它可以知道调用是安全的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将子类作为需要超类的方法的参数传递?

来自分类Dev

传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

来自分类Dev

Java继承;将子类传递给超类的抽象方法

来自分类Dev

将__init__值从更高的类传递到需要相同参数的子类中

来自分类Dev

定义抽象方法,但需要子类实现

来自分类Dev

将构造函数值从子类传递到超类 C++

来自分类Dev

将通用子类型类信息传递给Java中的超类

来自分类Dev

将参数传递给超类构造函数,而不必在子类构造函数中重复

来自分类Dev

在java中,我们可以将超类Object传递给子类引用吗?

来自分类Dev

需要一种将变量从User类传递到Locust中的TaskSet的方法

来自分类Dev

将子类的ArrayList复制到超类的ArrayList

来自分类Dev

如何将泛型传递给需要其超类的方法?

来自分类Dev

当子类调用超类的方法时,如何获得超类来引用子类中的属性?

来自分类Dev

如何将装饰器应用于子类中的超类方法?

来自分类Dev

子类中的方法可以重载超类中的方法吗?

来自分类Dev

将超类中的@Sql与子类中的@Sql合并

来自分类常见问题

用于将多态基类的子类数组传递到构造函数中的最简单语法

来自分类Dev

用于将多态基类的子类数组传递到构造函数中的最简单语法

来自分类Dev

在子类上调用虚拟方法将返回超类数据

来自分类Dev

在子类上调用虚拟方法将返回超类数据

来自分类Dev

子类和超类方法

来自分类Dev

在Java中的超类方法中创建新的子类

来自分类Dev

使用swift将数据从UITabBarView类传递到UIViewController的子类

来自分类Dev

在 Spring 中注入需要子类化框架类型的具体类

来自分类Dev

超类引用无法在Java中调用子类方法

来自分类Dev

如何使超类中的方法创建子类对象?

来自分类Dev

如何在Java中从超类调用子类方法?

来自分类Dev

在向量C ++中从超类调用子类方法

来自分类Dev

如何从超类的方法访问(屏蔽)子类中的成员变量?

Related 相关文章

  1. 1

    如何将子类作为需要超类的方法的参数传递?

  2. 2

    传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

  3. 3

    Java继承;将子类传递给超类的抽象方法

  4. 4

    将__init__值从更高的类传递到需要相同参数的子类中

  5. 5

    定义抽象方法,但需要子类实现

  6. 6

    将构造函数值从子类传递到超类 C++

  7. 7

    将通用子类型类信息传递给Java中的超类

  8. 8

    将参数传递给超类构造函数,而不必在子类构造函数中重复

  9. 9

    在java中,我们可以将超类Object传递给子类引用吗?

  10. 10

    需要一种将变量从User类传递到Locust中的TaskSet的方法

  11. 11

    将子类的ArrayList复制到超类的ArrayList

  12. 12

    如何将泛型传递给需要其超类的方法?

  13. 13

    当子类调用超类的方法时,如何获得超类来引用子类中的属性?

  14. 14

    如何将装饰器应用于子类中的超类方法?

  15. 15

    子类中的方法可以重载超类中的方法吗?

  16. 16

    将超类中的@Sql与子类中的@Sql合并

  17. 17

    用于将多态基类的子类数组传递到构造函数中的最简单语法

  18. 18

    用于将多态基类的子类数组传递到构造函数中的最简单语法

  19. 19

    在子类上调用虚拟方法将返回超类数据

  20. 20

    在子类上调用虚拟方法将返回超类数据

  21. 21

    子类和超类方法

  22. 22

    在Java中的超类方法中创建新的子类

  23. 23

    使用swift将数据从UITabBarView类传递到UIViewController的子类

  24. 24

    在 Spring 中注入需要子类化框架类型的具体类

  25. 25

    超类引用无法在Java中调用子类方法

  26. 26

    如何使超类中的方法创建子类对象?

  27. 27

    如何在Java中从超类调用子类方法?

  28. 28

    在向量C ++中从超类调用子类方法

  29. 29

    如何从超类的方法访问(屏蔽)子类中的成员变量?

热门标签

归档