Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将超类传递到需要子类的方法中_Java_Oop - Fatal编程技术网

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

Java 将超类传递到需要子类的方法中,java,oop,Java,Oop,好的,当我试图找到一个标题来解释这个问题时,我可能不得不对此进行扩展 最近,我实现了一个用于控制磁带库的小程序。由于知道它必须与多种不同类型的磁带库配合使用,因此开发了以下设计 interface Tapelibrary<T extends TapeDrive> { List<T> getListofDrives(); void doSomethingWithDrive(T d); } class SpecificTapeLibrary implemen

好的,当我试图找到一个标题来解释这个问题时,我可能不得不对此进行扩展

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

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() {
    }
}
接口磁带库{
List getListofDrives();
带驱动装置的无效剂量(T d);
}
类SpecificTapeLibrary实现Tapelibrary{
私人名单;
特定磁带库(){
添加(新的HPDrive());
添加(新的HPDrive());
添加(新的HPDrive());
}
@凌驾
公共列表getListofDrives(){
返回驱动器列表;
}
@凌驾
公共无效doSomethingWithDrive(HPDrive d){
d、 doSomethingHPspecific();
}
}
抽象类TapeDrive{
无效剂量测定法(){
}
}
HPDrive类扩展了TapeDrive{
无效剂量特定(){
}
}
正确的磁带库由工厂根据命令行参数确定

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
}
publicstaticvoidmain(字符串[]args){

Tapelibrary使用通用方法完成所有工作:

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);
}
static void doStuff(磁带库){
List listOfDrives=t.getListofDrives();
//用户通过使用一个小用户界面或其他什么来选择一个驱动器
T selectedDrive=listOfDrives.get(0);
t、 doSomethingWithDrive(选择驱动器);
}
然后从主方法调用此函数:

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

Tapelibrary为什么“特定于类的Tapelibrary实现Tapelibrary”需要HPDrive而不是TapeDrive?您的
DriveSelector
类没有什么用处:您从中得到的结果与直接调用
inputList.get(0)
完全相同。@efekActive-其思想是一个非抽象的(这是一个真实世界的磁带库)必须有一个非抽象的驱动器内置。我可能会看到另一个缺陷,因为这意味着磁带库总是有一种类型的驱动器内置在其中,这不一定是这样。非常感谢你的回答。我想我明白了。
Tapelibrary<? extends TapeDrive> t = new TapeLibraryFabric().get();
doStuff(t);