基本上我想这样做:
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的实例),但是这样我就得不到编译器的帮助了。你知道有什么办法吗?或者更聪明的解决方法......
答案 0 :(得分:16)
您可以在启用泛型的情况下执行此操作。例如,接受一个实现CharSequence和Appendable的类的实例:
public <T extends CharSequence & Appendable> void someMethod(T param) {
...
}
答案 1 :(得分:3)
根据设计,您可以执行以下操作之一:
无论哪种方式,你都希望拥有包含a()和b()的契约。
答案 2 :(得分:3)
嗯,有<T extends A & B> f(T ab)
符号,但你应该赞成合成而不是继承。你真的不需要扩展任何东西。只需创建一个类型为联合联合(产品)的类型A
和B
,如下所示:
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;
}
}
}
}
请注意,如果A
和B
是接口且您的对象同时实现这两个参数,则可以对两个参数使用相同的对象:
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) {
....
}
这并不难,相信我。