我已经完成了一些关于定义有界类型参数的阅读,比如
abstract class AbstractClass < T extends ClassA >
abstract class AbstractClass < T extends InterfaceSeq & InterfaceClone >
我的问题如下。我的AbstractClass
需要访问以下方法的数据对象(T):
getSeq() - gets sequence number of data object
_clone() - additional cloning logic of the data object
这两种方法都存在于ClassA
下。问题是,ClassA
是在两年前推出的。
有一些旧数据类实现InterfaceSeq
(包含getSeq()
)和InterfaceClone
(包含_clone()
):
DataClassA extends ClassA
DataClassB implements InterfaceSeq, InterfaceClone
DataClassA
&amp; DataClassB
有我需要的两种方法,但我很难在AbstractClass
中定义逻辑。
现在我有:
AbstractClass < T extends ClassA >
我需要像
这样的东西AbstractClass < T extends ClassA or (InterfaceSeq & InterfaceClone) >
将旧类迁移到使用ClassA
过于复杂。任何建议都表示赞赏。
答案 0 :(得分:3)
一些选项
只需让ClassA
同时实施InterfaceSeq
和InterfaceClone
,然后就可以使用
abstract class AbstractClass < T extends InterfaceSeq & InterfaceClone >
形式。
在适配器中包装所有ClassA
用法
public class ClassAAdaptor<T extends ClassA> implements InterfaceSeq, InterfaceClone {
private final T value;
ClassAAdaptor(T value) {
this.value = value;
}
@Override public Seq _getSeq() { return value.getSeq(); }
@Override public ClassAAdaptor<T> clone() { return new ClassAAdaptor(value.clone()); }
}
为每种情况制作两个不同的AbstractClass
es,每个工具都是一个接口。
interface IAbstractClass { ... }
class AbstractClassForInterface< T extends InterfaceSeq & InterfaceClone > implements IAbstractClass { ... }
class AbstractClassForClassA< T extends ClassA > implements IAbstractClass { ... }