2

我想装饰一组派生自一个公共类(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> {}
4

1 回答 1

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> {
}

是的。您可以通过引入类型参数来使子类成为泛型。

于 2013-03-25T18:11:38.670 回答