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(...));
但显然,现在 A
和 B
本身并不是 HashMap
和 TreeMap
的子 class,所以如果这正是您所需要的, 你真倒霉:-).
让我们在 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(...));
但显然,现在 A
和 B
本身并不是 HashMap
和 TreeMap
的子 class,所以如果这正是您所需要的, 你真倒霉:-).