2016-12-21 13 views
0

はのは、Java(7)で2つのクラスを持ってみましょう拡張:Javaのジェネリックは

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

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

それはこれらの2つのクラスが延長する共通の基底クラスを持つことは可能ですか?

ありがとうございました。

明確化:私はあなたが持つ抽象クラスを作成するべきだと思い

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>()); 
+5

これらはすでに['AbstractMap'](https://docs.oracle.com/javase/8/docs/api/java/util/AbstractMap.html)を拡張しています。これは共通の基本クラスです。 – khelwood

+0

khelwoodはすでに言っているように、彼らは共通の祖先を持っています。両方を拡張して達成しようとするものは何ですか? –

+0

また、それらは暗黙的に 'Object'を拡張します。 – njlarsson

答えて

2

いいえ、それは不可能です。 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はサブクラスそのものではありませんHashMapおよびTreeMapそれぞれ、それが必要なものなら、あなたは不運です:-)。

1

を共有することを望みますあなたが望む方法。そして、代わりに、HashMapとTreeMapを拡張し、必要に応じてこのデータ構造を新しいクラスのフィールドとして使用します。例えば

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

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

これは、「A 」と「B 」の参照を1つのデータ構造に保持することは可能ですか?その答えは、共通の基盤を持つ指定された問題を今のところ標的にしています。それ以外に、それは正しい。あなたはこれを行うことができます。 – Guardian667

0

:私は、どちらもあなたのような何かを行うことができますMap<T,T>を実装するなどのクラスが同じメソッド

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