Java 泛型扩展

Java Generics extends

让我们在 Java (7) 中有两个 classes:

public class A<T> extends HashMap<T, T>{
...
}

public class B<T> extends TreeMap<T, T>{
...
}

这两个 class 可以扩展一个公共基础 class 吗?

谢谢。

澄清:我希望 classes 共享相同的方法

public T f(T o){
...
}

由于它们都实现了 Map<T,T>,您可以执行以下操作:

public class A<T> extends HashMap<T, T> {
}

public class B<T> extends TreeMap<T, T> {
}

List<Map<String,String>> list = Arrays.asList(new A<String>(), new B<String>());

我认为您应该使用您想要的方法创建一个摘要 class。然后 os 扩展 HashMap 和 TreeMap,根据您的需要使用此数据结构作为新 classes 的字段。

例如:

public abstract class MyClass<T> {
   public T f(T o){
       ...
   }
}

public class A<T> extends MyClass<T> {
    private Map<T,T> mapThatINeed;
}

不,那是不可能的。 Java不支持多重继承,所以每个class只能继承一个class。因为你的两个 classes 已经扩展了一个不同的 class,你不能创建一个 class 作为你的两个 classes 的超级class。

一个可能的解决方案是使用组合:

public class MyMap<T> extends AbstractMap<T,T> {
    private Map<T,T> delegate;

    public MyMap(Map<T,T> delegate) {
        this.delegate = Objects.requireNonNull(delegate);
    }

    public Set<Map.Entry<T,T>> entrySet() {
        return delegate.entrySet();
    }

    // Optionally, implement other Map methods by calling the same methods
    // on delegate.

    public T f(T o) {
        // ...
    }
}

然后:

public class A<T> extends MyMap<T> {
    public A() {
        super(new HashMap<>());
    }
}
public class B<T> extends MyMap<T> {
    public B() {
        super(new TreeMap<>());
    }
}

或者简单地说:

Map<T,T> aMap = new MyMap<>(new SomeOtherMapImplementation(...));

但显然,现在 AB 本身并不是 HashMapTreeMap 的子 class,所以如果这正是您所需要的, 你真倒霉:-).