クラスに 2 つのコンストラクターがあるとします。
public User (List<Source1> source){
...
}
public User (List<Source2> source) {
...
}
これらのコンストラクターはどちらも User に関する同じ情報を提供し、さまざまなユースケースでユーザーを構築する有効な方法であるとしましょう。
Java では、型消去のためにこれを行うことはできません。Java は、パラメーターとして List< ? を持つ 2 つのコンストラクターを受け入れません。>。
それで、これを回避する方法は何ですか?やり過ぎではなく、基本的な OO を尊重するソリューションは何ですか? Java が強力なジェネリックをサポートしていないという理由だけで、ファクトリ メソッドやその他のインターフェイスを構築する必要があるのは間違っているようです。
私が考えることができる可能性は次のとおりです。
1)List<?>
コンストラクターのパラメーターとして a を受け入れ、必要なロジックの種類をコンストラクターで解析するか、受け入れられた型のいずれでもない場合は例外をスローします。
2) いずれかのリストを受け取り、適切なユーザー オブジェクトを構築して返すクラスを作成します。
3) ラッパーを作成List<Source1>
しList<Source2>
、代わりに User コンストラクターに渡すことができます。
4) この男を 2 つのクラスでサブクラス化します。コンストラクターを除くすべての機能が継承されます。一方のコンストラクターは Source1 を受け入れ、もう一方は Source2 を受け入れます。
5) インスタンス化のための 2 つの異なるデータ ソース用の 2 つの異なるビルダー メソッドがあるビルダーでこの男をラップします。
私の質問は次のとおりです。
1) これを行う必要があるのは Java の欠陥ですか、それとも意図的な設計上の決定ですか? 直感とは何ですか?
2) 不要な複雑さを導入することなく、適切なコードを維持するという点で最も強力なソリューションはどれですか? なんで?
この質問は似ています: Javaでの型消去に関するコンストラクターの設計ですが、詳細には触れず、さまざまな回避策を提案するだけです。