我有两个接口:
interface A {
void foo();
}
interface B {
void bar();
}
Run Code Online (Sandbox Code Playgroud)
我能够创建实现这些接口之一的类的匿名实例,如下所示:
new A() {
void foo() {}
}
Run Code Online (Sandbox Code Playgroud)
要么:
new B() {
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个实现两个接口的匿名类.像(虚构的):
new A implements B {
void foo() {}
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
这显然会产生编译错误:"B无法解析为类型".
解决方法很简单:
class Aggregate implements A, B {
void foo() {}
void bar() {}
}
Run Code Online (Sandbox Code Playgroud)
然后Aggregate
,我会使用匿名类.
我想知道一个匿名类实现两个接口是否合法.
dbf*_*dbf 57
"匿名内部类可以扩展一个子类或实现一个接口.与非匿名类(内部或其他)不同,匿名内部类不能同时执行这两种操作.换句话说,它不能同时扩展类并实现接口,也不能它实现了多个接口."(http://scjp.wikidot.com/nested-classes)
J S*_*rry 15
如果您决定这样做,您可以声明第三个接口,C:
public interface C extends A, B {
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以声明一个匿名内部类,这是C的一个实现.
一个完整的示例可能如下所示:
public class MyClass {
public interface A {
void foo();
}
public interface B {
void bar();
}
public interface C extends A, B {
void baz();
}
public void doIt(C c) {
c.foo();
c.bar();
c.baz();
}
public static void main(String[] args) {
MyClass mc = new MyClass();
mc.doIt(new C() {
@Override
public void foo() {
System.out.println("foo()");
}
@Override
public void bar() {
System.out.println("bar()");
}
@Override
public void baz() {
System.out.println("baz()");
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
这个例子的输出是:
foo()
bar()
baz()
Run Code Online (Sandbox Code Playgroud)
为了保存一些键击(例如,如果接口有很多方法),您可以使用
abstract class Aggregate implements A,B{
}
new MyObject extends Aggregate{
void foo(){}
void bar(){}
}
Run Code Online (Sandbox Code Playgroud)
请注意,关键是将Aggregate声明为抽象
归档时间: |
|
查看次数: |
20194 次 |
最近记录: |