0

クラスEmployeeとクラスがありBuildingます。
これらのクラスは、クラス階層の観点からは相互に関連していません。
たくさんのオブジェクトを処理する必要がありEmployeeBuildingそれらの結果は異なるリストになります。
だから私は持っていて、例えばインターフェース

public interface Processor{  
  public void process(String s, List<?> result);  
}  

文字列には、またはのsいずれかに関連する情報が含まれ、何らかの処理が行われた後の実装によって、オブジェクトまたはオブジェクトのいずれかが結果リストに追加されます。1つのisとa の2つの実装があります。 コードのどこかで、これらのいずれかへの参照を取得し、aまたはaのいずれかをメソッドに渡します。 EmployeeBuildingEmployeeBuilding
ProcessorEmployeeProcessorBuildingProcessor
List<Employee>List<Building>process

問題は、コードがコンパイルされないことです。
私が例えば内部で行うときEmployeeProcessorresult.add(new Employee(a,b,c,d));
私は得る:

List型のメソッドadd(capture#2-of?)は、引数には適用できません。

問題は理解できると思いますが、インターフェイスを次のように変更したくありません。

public interface Processor{  
  public process(String s, List result);  
}   

つまり、リストのタイプを指定しません。
この問題を回避する方法はありますか?インターフェイスの定義が間違っていますか?
注:このインターフェースはCommandパターンの実装の一部です

4

1 に答える 1

3

This is what I was thinking.

interface Processor<T>{
    public void process(String s, List<T> result);
}

class BuildingProcessor implements Processor<Building>{
    @Override
    public void process(String s, List<Building> result) {
        result.add(new Building());
    }
}

class EmployeeProcessor implements Processor<Employee>{
    @Override
    public void process(String s, List<Employee> result) {
        result.add(new Employee());
    }
}

FYI, you can further limit the type. For example, if both Building and Employee classes implement, lets say, Processable, then you can do interface Processor<T extends Processable>

于 2012-05-05T09:56:46.243 に答える