我想装饰一组派生自公共类(TextView)的类。这些类存在于库中,因此我不能简单地修改基础或插入其继承层次结构。
class A {
}
class B extends A {
}
class C extends A {
}
class D extends B {
void decoration(){}
}
在上面的例子中,D类是装饰类。装饰功能对我的每个装饰课都很常见。
我的问题是,是否可以在Java中模拟基类?类似的东西:
class D<T> extends <T ? extends A> {}
答案 0 :(得分:2)
所以你的问题是关于动态地向现有类添加方法?与Objective-C中的类别类似的东西。这在Java中并不容易,因为一旦通过 ClassLoader 加载一个类,就无法动态地向它添加任何内容。
我想到的最简单的事情是提供一个自定义映射,它将在现有类外部的任何机会。类似的东西:
interface Method<T extends A> {
public void invoke(T ref);
}
class MethodForA implements Method<A> {
public void invoke(A ref) { .. }
}
class MethodMapper {
Map<Class<?>, Method<? extends A>> mapping;
MethodMapper() {
mapping = new HashMap<Class<?>, Method<? extends A>>();
mapping.put(A.class, new MethodForA());
}
void invoke(A object) {
Method<? extends A> method = mapping.get(object.getClass());
if (method != null) {
method.invoke(object);
}
}
我刚刚写了这个样板代码,所以一切都不会是正确的,但它的工作方式就是这个。我想你需要做一些运行时类型检查,以避免盲目地投射东西。
如果您想知道这是否合法:
class A {
}
class B<T> extends A {
}
class C<T, U> extends B<T> {
}
是的,确实如此。您可以通过引入类型参数来使子类成为通用的。