Java继承问题

时间:2014-09-30 17:51:45

标签: java inheritance

我有一个类似于:

的抽象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
}

但是编译器抱怨我尝试过的东西,其中包括:

  • 通过将[ABCDE]替换为X
  • 来更改地图声明(左侧)
  • 将地图投射到Map<String,X>函数调用
  • 中的someFunction

还尝试使用已实现的接口而不是扩展类。不确定我做错了什么。

修改
对不起,我赶紧提问,所以我搞错了。我的地图实际上是:

Map<String,List<A>> mapA = new HashMap<String,List<A>>();

...所以someFunction签名实际上是:

void someFunction(Map<String,List<X>> mapX) 

我不确定这是否会产生很大的影响。

4 个答案:

答案 0 :(得分:2)

尝试声明

<T extends X> void someFunction(Map<String,List<T>> mapX)

即使AX的子类,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();
        }
    }
}