Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Generics - Fatal编程技术网

如果实现的方法是泛型的,我可以将实现相同接口的java类放在一个列表中吗?

如果实现的方法是泛型的,我可以将实现相同接口的java类放在一个列表中吗?,java,oop,generics,Java,Oop,Generics,我已经看过了类似问题的建议列表,但没有看到任何对我有帮助的东西,所以我要问这个……我希望你能理解,这很难解释(我已经简化了它,以了解我在寻找什么)。基本上,我认为这种设计有一些冗余组件,我想知道他们的设计是否更适合这样做 我有两门课,既有一些相似之处,也有一些不同之处。将它们联系在一起的一件重要事情是它们都必须实现一个assign()方法…这保证了一个可分配的接口(我认为): 现在,系统的其他部分使用WorkerClassA和WorkerClassB的不同部分-你可以想象一个WorkerClas

我已经看过了类似问题的建议列表,但没有看到任何对我有帮助的东西,所以我要问这个……我希望你能理解,这很难解释(我已经简化了它,以了解我在寻找什么)。基本上,我认为这种设计有一些冗余组件,我想知道他们的设计是否更适合这样做

我有两门课,既有一些相似之处,也有一些不同之处。将它们联系在一起的一件重要事情是它们都必须实现一个assign()方法…这保证了一个可分配的接口(我认为):

现在,系统的其他部分使用WorkerClassA和WorkerClassB的不同部分-你可以想象一个WorkerClassA处理器对报告的内容进行处理,一个WorkerClassB处理器对发现的内容进行处理

但系统中也有一部分只是想跟踪工人……事实上,它想跟踪任何可分配的东西。我不知道如何做到这一点……因此,我创建了一个Worker超类,并让WorkerClassA和WorkerClassB扩展它。然后我可以存储所有工人的列表:

public class Worker {
    String name; 
    public Worker(String name) {this.name = name;}
    public String getName() {return name;}
    public String toString() {return this.getName();}
}
现在我调整我的Worker子类来扩展它:

public class WorkerClassA extends Worker implements Assignable<AssnAtype>{
    AssnAtype assignment;
    public WorkerClassA(String name) {super(name);}
    public void report() {//reports on something}
    public void assign (AssnAtype assn) {assignment = assn;} 
}

public class WorkerClassB extends Worker implements Assignable<AssnBtype>{
    AssnBtype assignment;
    public WorkerClassB(String name) {super(name);}
    public void report() {//reports on something}
    public void assign (AssnBtype assn) {assignment = assn;} 
}
公共类WorkerClassA扩展了Worker实现可分配{
助理类型分配;
公共工作类别(字符串名称){super(名称);}
public void report(){//reports on something}
public void assign(AssnAtype assn){assignment=assn;}
}
公共类WorkerClassB扩展了Worker实现可分配{
AssnBtype赋值;
公共工作类别B(字符串名称){super(名称);}
public void report(){//reports on something}
public void assign(AssnBtype assn){assignment=assn;}
}
这样我就可以将所有工人存储在一个列表中:

   public static void main(String[] args) {
        
       WorkerClassA reporter = new WorkerClassA("Charlie");
       reporter.assign(new AssnAtype());
    
       WorkerClassB inventor = new WorkerClassB("Sally");
       inventor.assign(new AssnBtype());
    
       ArrayList<Worker> workerList= new ArrayList<Worker>();
       workerList.add(reporter);
       workerList.add(inventor);
    
       for (Worker w : workerList) {
           System.out.println(w);
       }
   }
publicstaticvoidmain(字符串[]args){
WorkerClassA reporter=新WorkerClassA(“查理”);
reporter.assign(新的AssnAtype());
WorkerClassB inventor=新WorkerClassB(“Sally”);
inventor.assign(新的AssnBtype());
ArrayList workerList=新建ArrayList();
workerList.add(reporter);
workerList.add(inventor);
for(工人w:工人列表){
系统输出打印LN(w);
}
}

我更喜欢简单地将所有可分配的内容存储在列表中,而不是创建Worker超类,但我认为我做不到(我想其他非Worker的东西也可以分配,但我没有这个意图……不管怎样,我想这是我不应该/不能这样做的原因?)。这是我能做的最好的方法吗(即这是强制我的工人类可分配的最好方法,同时允许他们分配不同的事物子类型,并确保我可以将它们全部存储在一个列表中)?

如果你只想有一个可分配的列表,就让它成为可分配的类型。List>assignableList=new ArrayList();@juwil的建议在设计方面是否可以接受……它是否有任何缺陷,或者其目的是什么?有关通用通配符的更多详细信息,请参阅。您不需要工人类,似乎与此问题完全正交。这些人有一个你无法增加的缺点。List>允许您检索Assignable,但它可以是List或List。我可以得到一些澄清@matt:如果我不使用Assignable,我需要工人类。但是,只要我只需要从列表中检索两个可分配类型,使用可分配就可以了……而且,我认为我不需要列表>,我可以使用列表
public class WorkerClassA extends Worker implements Assignable<AssnAtype>{
    AssnAtype assignment;
    public WorkerClassA(String name) {super(name);}
    public void report() {//reports on something}
    public void assign (AssnAtype assn) {assignment = assn;} 
}

public class WorkerClassB extends Worker implements Assignable<AssnBtype>{
    AssnBtype assignment;
    public WorkerClassB(String name) {super(name);}
    public void report() {//reports on something}
    public void assign (AssnBtype assn) {assignment = assn;} 
}
   public static void main(String[] args) {
        
       WorkerClassA reporter = new WorkerClassA("Charlie");
       reporter.assign(new AssnAtype());
    
       WorkerClassB inventor = new WorkerClassB("Sally");
       inventor.assign(new AssnBtype());
    
       ArrayList<Worker> workerList= new ArrayList<Worker>();
       workerList.add(reporter);
       workerList.add(inventor);
    
       for (Worker w : workerList) {
           System.out.println(w);
       }
   }