扩展接口的所有实现的功能?

时间:2009-11-13 06:50:42

标签: java generics

我正在寻找一组函数,可以扩展某个接口的所有实现以供使用。我的问题是,是否有办法没有使用代理或手动扩展接口的每个实现?

我最初的想法是看看是否可以使用泛型;使用参数化类型作为我的实现的超类型...

public class NewFunctionality<T extends OldFunctionality> extends T {
    //...
}

......但这是非法的。我不完全知道为什么这是非法的,但它确实感觉它是正确的(可能因为T 本身可能是一个接口而不是一个实现)。

还有其他方法可以实现我的目标吗?

编辑我可能要做的一件事就是扩展java.util.List ...使用我狡猾的非法语法:

public class FilterByType<T extends List> extends T {

 public void retainAll(Class<?> c) {
  //..
 }

 public void removeAll(Class<?> c) {
  //..
 } 

}

5 个答案:

答案 0 :(得分:3)

您可以使用称为“装饰器”的编程模式来实现这样的功能(尽管如果接口很大,那么不幸的是,在Java中实现这一点有点冗长,因为您需要编写每个方法的单行实现界面):

public class FilterByType<T> implements List<T> {

    private List<T> _list;

    public FilterByType(List<T> list) {
        this._list = list;
    }

    public void retainAll(Class<?> c) {
        //..
    }

    public void removeAll(Class<?> c) {
        //..
    }

    // Implement List<T> interface:

    public boolean add(T element) {
        return _list.add(element);
    }

    public void add(int index, T element) {
        _list.add(index, element);
    }

    // etc...

}

或者,如果方法不需要访问受保护的成员,那么静态辅助方法是一种不那么笨拙的方法:

public class FilterUtils {

    public static void retainAll(List<T> list, Class<?> c) {
        //..
    }

    public static void removeAll(List<T> list, Class<?> c) {
        //..
    }

}

答案 1 :(得分:1)

什么阻止您只是向界面添加新方法?

如果您不能仅将新功能添加到旧接口,则可以考虑创建另一个接口,然后再实现仅实现这两个接口的实现。为了清楚起见,在代码中这就是我的意思:

// Old functionality:
public interface Traveling {
    void walk();
}
// Old implementation:
public class Person implements Traveling {
    void walk() { System.out.println("I'm walking!"); }
}
// New functionality:
public interface FastTraveling {
    void run();
    void fly();
}
// New implementation, option #1:
public class SuperHero extends Person implements FastTraveling {
    void run() { System.out.println("Zoooom!"); }
    void fly() { System.out.println("To the skies!"); }
}
// New implementation, option #2:
public class SuperHero implements Traveling, FastTraveling {
    void walk() { System.out.println("I'm walking!"); }
    void run() { System.out.println("Zoooom!"); }
    void fly() { System.out.println("To the skies!"); }
}

答案 2 :(得分:1)

我认为这是非法的,因为你不能保证T级是什么。还有技术障碍(父类的名称必须用字节码写,但泛型信息在字节码中丢失)。

你可以像这样使用Decorator模式:

class ListDecorator implements List {
  private List decoratingList;
  public ListDecorator(List decoratingList){
    this.decoratingList = decoratingList;
  }

  public add(){
     decoratingList.add();
  }

  ...
}

class FilterByArrayList extends ListDecorator {
  public FilterByAbstractList () {
    super(new ArrayList());
  }
}

答案 3 :(得分:1)

有一个委托/ mixin框架允许这种形式。您可以定义一个新接口,实现该接口的默认实现,然后请求实现该接口的类,但从层次结构中的其他地方请求子类。

它被称为mixins for Java,并且有一个网络广播就可以演示它。

答案 4 :(得分:0)

我担心你不清楚你想得到什么。

基本上,我认为使用 '公共类NewFunctionality&lt; T extends OldFunctionality&gt;没有任何好处。扩展T' '公共类相比,NewFunctionality扩展OldFunctionality' '公共类FilterByType&lt; T扩展List&gt ;扩展T' vs '公共类FilterByType&lt; T&gt;实现List&lt; T&gt;'