你可以一次要多种类型吗?

时间:2009-01-13 03:18:51

标签: java inheritance types interface

基本上我想这样做:

public interface A {
    void a();
}
public interface B {
    void b();
}
public class SomeClass {
    public SomeClass(<A&B> e) { // Note the type here
        e.a();
        e.b();
    }
}

我在评论线上所做的事实显然是非法的。我知道我只需要传递的对象来实现接口A或接口B,但有两种方法可以做到吗?

我想有一些解决方法(比如要求参数为A类,然后检查它是否也是B的实例),但是这样我就得不到编译器的帮助了。你知道有什么办法吗?或者更聪明的解决方法......

5 个答案:

答案 0 :(得分:16)

您可以在启用泛型的情况下执行此操作。例如,接受一个实现CharSequence和Appendable的类的实例:

  public <T extends CharSequence & Appendable> void someMethod(T param) {
    ...
  }

答案 1 :(得分:3)

根据设计,您可以执行以下操作之一:

  1. 制作A:B或B:A。
  2. 创建一个界面C:A,B。
  3. 无论哪种方式,你都希望拥有包含a()和b()的契约。

答案 2 :(得分:3)

嗯,有<T extends A & B> f(T ab)符号,但你应该赞成合成而不是继承。你真的不需要扩展任何东西。只需创建一个类型为联合联合(产品)的类型AB,如下所示:

public abstract class P2<A, B> {
  public A _1();
  public B _2();
}

有时称为产品-2或“配对”类型。您可以为这些创建一个方便的构造函数:

public final class P {
  private P() {}
  public static <A, B> P2 p(final A a, final B b) {
    return new P2<A, B>() {
      public A _1() {
        return a;
      }
      public B _2() {
        return b;
      }
    }
  }
}

请注意,如果AB是接口且您的对象同时实现这两个参数,则可以对两个参数使用相同的对象:

P2<A, B> both = P.p(o, o);

或者您可以自由地使用两个不同的对象,使设计更好并且分离。

您会在Functional Java库中找到此类型以及最多8种类型的产品。还有一种名为Either<A, B>的类型,它是两种类型的不相交联合(总和),因此它包含A或{{1}类型的值(或两者)。

答案 3 :(得分:1)

只是在黑暗中拍摄,我不知道这是否是正确的语法,即如果你必须重新声明C中的方法,那么这个:

public interface A {
    void a();
}
public interface B {
    void b();
}

public interface C extends A, B{}

public class SomeClass{
    public SomeClass(C e) { // Note the type here
      e.a();
      e.b();
    }

}

答案 4 :(得分:0)

如果你的方法需要两个不同的接口作为参数,那么只需要两个参数。

public void foo(A a, B b) {
    ....
}

这并不难,相信我。