私のアプリケーションは、プロジェクト(Project
クラス)、およびEmployees
を持つ会社を代表しています。すべてEmployee
はWorker
であり、Leader
はすべてWorker
であり、ProjectLeader
およびDeveloperLeader
はすべてLeader
です。1つのジェネリック型引数を持つ1つのメソッドでインスタンスを収集して返す方法は?
Company
クラスのメソッドを作成します。このメソッドは型引数を受け取り、指定された型のすべてのインスタンスを含むSet
を返します。同社は、すべてのプロジェクトを表現したプロジェクト、あります
private static Set<Project> projects = new HashSet<>();
を、すべてのプロジェクトは、プロジェクトのすべての労働者を代表する、リストを持っています
public List<Worker> workersOnProject = new ArrayList<>();
だから私は私の方法を受け入れることができるようにしたいです次の型引数:Project
,Employee
,Worker
,Leader
,ProjectLeader
,DeveloperLeader
。私の方法は次のとおりです。私は、たとえばprojectLeaderインスタンスを作成する場合
public <T> Set<T> getSameTypeEntity(Class<T> cls) {
Set<T> sameTypeEntities = new HashSet<>();
if (cls == com.example.project.Project.class) {
sameTypeEntities.addAll((Collection<? extends T>) projects);
} else {
for (Project p : projects) {
for (Object e : p.workersOnProject) {
if (e.getClass() == cls) {
sameTypeEntities.add((T) e);
}
}
}
}
return sameTypeEntities;
}
、私が使用します。Leader.class
ため
getSameTypeEntity(Leader.class);
getSameTypeEntity(DeveloperLeader.class);
:
ProjectLeader pL1 = new ProjectLeader();
をしかし、私はこのようなメソッドを呼び出すとき引数私のメソッドは空のSet
を返しますが、それはDeveloperLeader.class
のために働きます。したがって、スーパークラスの引数(Employee
、Leader
)で呼び出すことはできません。Worker.class
の場合は、このように作成されたインスタンスのみが戻されますが(Worker w1 = new Worker();
)、であるため、すべてのLeaderサブタイプも返す必要があります。
「上位レベル」の引数を使用して呼び出すときに、どのようにすべてのサブクラスインスタンスを返すことができますか?私は確かではない、私は適切な方法でジェネリックを使用しているので、任意のクリーンなコードや使用法のアドバイスをいただきありがとうございます!
はあなたに感謝し、より慣用のJava 8のスタイルで再書かれたあなたの方法です!まさに私が欲しかったもの:) – dmbdnr