我有一个类似于:
的抽象java类public abstract class X {
public abstract void commonFunction();
}
我也有一堆地图,我想这样:
Map<String,A> mapA = new HashMap<String,A>();
Map<String,B> mapB = new HashMap<String,B>();
Map<String,C> mapC = new HashMap<String,C>();
Map<String,D> mapD = new HashMap<String,D>();
Map<String,E> mapE = new HashMap<String,E>();
A,B,C,D和E都扩展为X,因此它们都实现了commonFunction()
我希望能够调用这样的函数:
someFunction(mapA); // or someFunction(mapB) etc.
... someFunction看起来像:
void someFunction(Map<String,X> mapX) {
...some stuff
x.commonFunction();
...more stuff
}
但是编译器抱怨我尝试过的东西,其中包括:
Map<String,X>
函数调用someFunction
还尝试使用已实现的接口而不是扩展类。不确定我做错了什么。
修改
对不起,我赶紧提问,所以我搞错了。我的地图实际上是:
Map<String,List<A>> mapA = new HashMap<String,List<A>>();
...所以someFunction
签名实际上是:
void someFunction(Map<String,List<X>> mapX)
我不确定这是否会产生很大的影响。
答案 0 :(得分:2)
尝试声明
<T extends X> void someFunction(Map<String,List<T>> mapX)
即使A
是X
的子类,Map<String,List<A>>
也不是 Map<String,List<X>>
的子类。
你需要使用上面的generic method来获得一个接受任何Map<String, List<any class that extends X>>
的参数(&#34;任何扩展X
&#34;的类都由类型表示参数T
)。
答案 1 :(得分:1)
但是编译器抱怨我试过的东西
多态性规则不适用于泛型。
List<X> list = new ArrayList<A>; // Invalid. Polymorphism does not in declaration or referencing
但是,这是有效的:
List<X> list = new ArrayList<X>;
list.add(new A()); // Can add sub-type of X
list.add(new B());
试试这个:
void someFunction(Map<String,? extends X> mapX) {
答案 2 :(得分:0)
您无法在方法中调用X
,您必须通过地图访问它,就像这样
mapX.get("myKey").commonFunction();
刚刚测试过它:
void tester() {
Map<String, X> testMap = new HashMap<String,X >();
testMap.put("myKey", new A());
someFunction(testMap);
}
void someFunction(Map<String, X> myMap) {
myMap.get("myKey").doSomething();
}
abstract class X {
abstract void doSomething();
}
class A extends X {
@Override
void doSomething() {
System.out.println("I'm A");
}
}
class B extends X {
@Override
void doSomething() {
System.out.println("I'm B");
}
}
class C extends X {
@Override
void doSomething() {
System.out.println("I'm C");
}
}
答案 3 :(得分:0)
这应该有效:
<K extends X> void someFunction( Map<String, List<K>> mapX ) {
for ( List<K> list : mapX.values() ) {
for ( X obj : list ) {
obj.commonFunction();
}
}
}