私が遊んでいる興味深いアーキテクチャがあります。ユーザーは StoredObject を含む Store を作成できます。ストアは、インターフェイス (つまり、Get、Put、Print) によって表されるさまざまな操作をサポートできます。
これは非常に単純化されたもので、次のようになります。
interface Put<Foo>{
public void put(Foo f);
}
class Store implements Put<Store.Obj<?>> {
class Obj<T> {
public T o;
}
@Override
public void put(Obj<?> o) { }
}
public class Main {
public static void main(String[] args){
Store s = new Store();
Store.Obj<String> o = s.new Obj<>();
s.put(o);
}
}
同様の「get」メソッドを実装したいときに問題が発生します。理想的には、次のようなインターフェイスが必要です。
interface Get<Foo> {
public <T> T get(Foo<T> f);
}
明らかに、これは不正な Java です。これが意図していることを達成するために使用できる構文 (またはハック) はありますか? 事実上、定数型をジェネリック パラメーターとして指定する代わりに、パラメーター化可能な型をジェネリック パラメーターとして指定したいと考えています (それ自体が get メソッドでパラメーター化されます)。はい、これは Java にはない高次の型に要約されます。クレイジーで醜いハックは大歓迎です!
他の設計上の制約により機能しない一般的なソリューション:
- get/put/etc 操作を内部
Obj
クラスに移動する Store.Obj<T>
ジェネリックパラメーターではなく、スーパータイプを作成し、それを取るインターフェイスを指定します。