どのブードゥーであなたは自分自身を夢中にさせましたか:)?質問とコメントから、抽象クラスを拡張しSomeClass
、インターフェイスも実装するオブジェクトがあることを確信していると思いSomeOtherClass
ました。この場合、これらのプロパティを共有する階層内の中間抽象クラスを提案します。
public abstract class Foo<K> extends SomeClass implements SomeOtherClass<K> {
...
}
そうすれば、静的メソッドのシグネチャを次のように単純化できます。
public <K,V extends Foo<K>> void doSomethingWithSomeMap (Map<K,V> map, V data);
現在のオブジェクト階層を変更したくない場合は、アダプタパターンで別のレベルの間接参照を使用してコンパイラをだますことができます。
「コンピュータサイエンスのすべての問題は、別のレベルの間接参照によって解決できます。」-デビッドウィーラー
public abstract class SomeClass {
public abstract void method1();
}
public interface SomeOtherClass<K> {
void method2(K value);
}
public class MyClass extends SomeClass implements SomeOtherClass<Integer> {
@Override
public void method1() {
System.out.println("MyClass.method1");
}
@Override
public void method2(Integer value) {
System.out.println("MyClass.method2(" + value + ")");
}
}
public class Indirection<K> extends SomeClass implements SomeOtherClass<K> {
private final Object objectValue;
public Indirection(final Object value) {
this.objectValue = value;
}
@Override
public void method1() {
((SomeClass) objectValue).method1();
}
@Override
public void method2(K value) {
@SuppressWarnings("unchecked")
SomeOtherClass<K> delegate = ((SomeOtherClass<K>) objectValue);
delegate.method2(value);
}
}
public static void main(String[] args) {
Map someMap = new HashMap<Integer, MyClass>();
SomeClass someData = new MyClass();
Indirection a = new Indirection(someData);
doSomethingWithSomeMap(someMap, a, 12);
}
public static <K,V extends SomeClass & SomeOtherClass<K>>
void doSomethingWithSomeMap (Map<K,V> map, V data, K value) {
data.method1();
data.method2(value);
}
これは印刷されます:
MyClass.method1
MyClass.method2(12)