是否可以从模板参数扩展?

时间:2013-03-25 18:02:44

标签: java

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

1 个答案:

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

是的,确实如此。您可以通过引入类型参数来使子类成为通用的。