В какое вуду вы попали :)? Из вопроса и комментариев я предположил, что вы уверены, что у вас есть объекты, которые расширяют абстрактный класс 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);
Если вы не хотите изменять текущую иерархию объектов, вы можете обмануть компилятор, используя другой уровень косвенности с шаблоном адаптера *1012*.
«Все проблемы в информатике могут
быть решен другим уровнем
косвенность. "- Дэвид Уилер
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)