マークされた行がコンパイルされないため、次のコードは機能しません。
MyClass {
//singleton stuff
private static MyClass instance;
private MyClass () {}
public static MyClass getInstance() {
if(instance==null) {
instance = new MyClass ();
}
return instance;
}
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?> c1, Class<?> c2) {
return new GenericClass<c1,c2>; // DOES NOT COMPILE!!!
}
}
MyClass をジェネリックにしたくありません。なんで?メソッド create の実際の実装は次のようになるためです。
// method creating problems
public NonGenericSuperClassOfGenericClass create(Class<?>... classes) {
if(someCondition)
return new GenericClass<classes[0],classes[1]>;
else
return new OtherGenericClass<classes[0]>;
}
したがって、MyClass を特定のジェネリックに結合することはできません。渡されたパラメーターを使用して GenericClass をインスタンス化する方法はありますか? どのように?
ありがとう
回答ありがとうございます。私はあなたにすべての話をします。
私はSpringを使用しており、 MongoDBを使用する予定です。
クラス GenericClass は次のようなものです。
GenericClass<PersistetType1, Long>
また
GenericClass<PersistentType2, Long>
ここで、PersistentType1/2 は最終的に DB に格納する必要があるクラスであり、GenericClass は Mongo API にアクセスするための一種のプロキシです。実際には、次のようになります。
public MongoTemplate getTemplate();
public void save(T toInsert);
public List<T> select(Query selectionQuery);
public T selectById(ID id);
public WriteResult update(Query selectionQuery, Update updatedAttributes);
public void delete(T toRemove);
public void delete(Query selectionQuery);
それで?コントローラ (またはうるさい場合はエンティティ) から、リポジトリをインスタンス化し、任意のメソッドを呼び出す必要があります。これにより、コントローラーは MongoDB と結合されます。つまり、コントローラーは、実際には MongoRepository と呼ばれ、Mongo に厳密に依存する GenericClass を明示的にインスタンス化する必要があります (実際、これは正確に 2 つの「自由度」を持つジェネリックです)。
そこで、コントローラーを分離する別のプロキシである MyClass を作成することにしました。このようにして、Controller は MyClass の単一のインスタンスを取得し、適切なリポジトリの新しいインスタンスを作成できるようにします。特に、「somecondition」が true の場合は、MongoRepository を使用することを意味します (false の場合、Hibernate プロキシ、つまり HibernateRepository をインスタンス化する必要がある可能性があります)。ただし、MongoRepository は汎用であるため、パラメーターとして渡すことを望んでいたインスタンス化の何らかの形式が必要です。
残念ながら、ジェネリックはコンパイル時に解決されるため、私には機能しないと思います。
どうすれば修正できますか?