繁体   English   中英

Java泛型扩展

[英]Java Generics extends

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

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

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

是否有可能会扩展这两个类的公共基类?

谢谢。

澄清:我希望这些类共享相同的方法

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

不,那是不可能的。 Java不支持多重继承,因此每个类只能扩展一个类。 由于您的两个类都已经扩展了一个不同的类,因此您不能创建作为两个类的超类的类。

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

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子类,因此如果您需要它,那您就不走运了:-)。

当它们都实现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>());

我认为您应该使用所需的方法创建一个Abstract类。 然后,OS扩展了HashMap和TreeMap,请根据需要将此数据结构用作新类的字段。

例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM