为什么匿名 class 不能实现两个分离的接口但可以实现内部接口?
Why an anonymous class can't implement two separated interfaces but can implement inner interfaces?
匿名 class 只能从一个 class 或接口扩展,所以我不能做下一个 :
interface Enjoyable {
public void enjoy();
}
interface Exercisable {
public void exercise();
}
public class Test {
public static void main(String[] args) {
new Enjoyable implements Exercisable() {
public void enjoy() {
System.out.println(":D");
}
}.enjoy();
}
}
它说:
Enjoyable.Exercisable cannot be resolved to a type
我正在尝试复制此行为并编写了下一个代码:
interface Enjoyable {
interface Exercisable {
public void exercise();
}
public void enjoy();
}
public class Test {
public static void main(String[] args) {
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.exercise();
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
}
}
然后我得到:
Doing exercise !!! :D
还有其他方法可以模拟吗?
我必须以匿名的方式实施这两种方法 class ?
谢谢
I want an anonymous class who implements 2 interfaces methods
我假设你的意思是你想要一个实现两个接口的匿名 class。你不能,直接。
你可以做到
interface EnjoyableAndExercisable extends Enjoyable, Exercisable {
}
然后创建一个实现它的匿名 class。
EnjoyableAndExercisable o = new EnjoyableAndExercisable() {
@Override
public void enjoy() {
System.out.println(":D");
}
@Override
public void exercise() {
System.out.println("Doing exercise !!!");
}
};
请注意 @Override
,它将始终验证您是否实际覆盖了方法。
但是在您的代码中,这个匿名 class
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
只是 Exercisable
的一个实现。您只是碰巧在其中声明了一个名称为 enjoy
的方法。
您不能将其分配给 Enjoyable
类型的变量
Enjoyable ref = new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}; // nope, compile time error
您只能在声明此匿名类型的新实例创建表达式上调用该方法。您不能以任何其他方式调用它(因为它是以匿名类型声明的)。
你的 Exercisable 不愉快 :-)
以这种方式嵌套接口并不意味着内部接口是
外接口的类型 !
你也可以这样写
new Object() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy()
// same for .excercise()
所以你实际上并没有模拟实现两个接口的匿名class。
当您实际尝试将匿名实例分配给接口类型的变量时,您会看到这一点
// this WILL NOT COMPILE !
Enjoyable enjoyable=new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
你当然可以这样做:
interface Enjoyable {
public void enjoy();
}
interface Exercisable extends Enjoyable {
public void exercise();
}
然后使用这些接口创建匿名实例
不幸的是,创建一个实现两个接口的匿名实例是不可能的。
您可以基于非最终 class 或具有
的接口创建匿名内部 classes
new Exerciseable(){
...
}
但是Java不允许
new Object() implements Exercisable{
...
}
或
new Object implements Exercisable(){
...
}
匿名内部 class 使用 new
关键字生成一个 class 的新实例,其 superclass 是 Object
并实现 Exercisable
. JCP 站点托管一个文档 (https://jcp.org/aboutJava/communityprocess/maintenance/JLS/innerclasses.pdf),属于关于内部 classes 的 JSL,它说:
As already hinted, if an anonymous class is derived from an interface
I, the actual superclass is Object, and the class implements I rather
than extending it. (Explicit implements clauses are illegal.) This is
the only way an interface name can legally follow the keyword new. In
such cases, the argument list must always be null, to match the
constructor of the actual superclass, Object.
您的第二个示例构造了一个扩展 Enjoyable
的类型 Exercisable
。创建该接口的匿名 classes 再次合法。
匿名 class 只能从一个 class 或接口扩展,所以我不能做下一个 :
interface Enjoyable {
public void enjoy();
}
interface Exercisable {
public void exercise();
}
public class Test {
public static void main(String[] args) {
new Enjoyable implements Exercisable() {
public void enjoy() {
System.out.println(":D");
}
}.enjoy();
}
}
它说:
Enjoyable.Exercisable cannot be resolved to a type
我正在尝试复制此行为并编写了下一个代码:
interface Enjoyable {
interface Exercisable {
public void exercise();
}
public void enjoy();
}
public class Test {
public static void main(String[] args) {
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.exercise();
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
}
}
然后我得到:
Doing exercise !!! :D
还有其他方法可以模拟吗? 我必须以匿名的方式实施这两种方法 class ?
谢谢
I want an anonymous class who implements 2 interfaces methods
我假设你的意思是你想要一个实现两个接口的匿名 class。你不能,直接。
你可以做到
interface EnjoyableAndExercisable extends Enjoyable, Exercisable {
}
然后创建一个实现它的匿名 class。
EnjoyableAndExercisable o = new EnjoyableAndExercisable() {
@Override
public void enjoy() {
System.out.println(":D");
}
@Override
public void exercise() {
System.out.println("Doing exercise !!!");
}
};
请注意 @Override
,它将始终验证您是否实际覆盖了方法。
但是在您的代码中,这个匿名 class
new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
只是 Exercisable
的一个实现。您只是碰巧在其中声明了一个名称为 enjoy
的方法。
您不能将其分配给 Enjoyable
Enjoyable ref = new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}; // nope, compile time error
您只能在声明此匿名类型的新实例创建表达式上调用该方法。您不能以任何其他方式调用它(因为它是以匿名类型声明的)。
你的 Exercisable 不愉快 :-) 以这种方式嵌套接口并不意味着内部接口是 外接口的类型 !
你也可以这样写
new Object() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy()
// same for .excercise()
所以你实际上并没有模拟实现两个接口的匿名class。
当您实际尝试将匿名实例分配给接口类型的变量时,您会看到这一点
// this WILL NOT COMPILE !
Enjoyable enjoyable=new Enjoyable.Exercisable() {
public void enjoy() {
System.out.println(":D");
}
public void exercise() {
System.out.println("Doing exercise !!!");
}
}.enjoy();
你当然可以这样做:
interface Enjoyable {
public void enjoy();
}
interface Exercisable extends Enjoyable {
public void exercise();
}
然后使用这些接口创建匿名实例 不幸的是,创建一个实现两个接口的匿名实例是不可能的。
您可以基于非最终 class 或具有
的接口创建匿名内部 classesnew Exerciseable(){
...
}
但是Java不允许
new Object() implements Exercisable{
...
}
或
new Object implements Exercisable(){
...
}
匿名内部 class 使用 new
关键字生成一个 class 的新实例,其 superclass 是 Object
并实现 Exercisable
. JCP 站点托管一个文档 (https://jcp.org/aboutJava/communityprocess/maintenance/JLS/innerclasses.pdf),属于关于内部 classes 的 JSL,它说:
As already hinted, if an anonymous class is derived from an interface I, the actual superclass is Object, and the class implements I rather than extending it. (Explicit implements clauses are illegal.) This is the only way an interface name can legally follow the keyword new. In such cases, the argument list must always be null, to match the constructor of the actual superclass, Object.
您的第二个示例构造了一个扩展 Enjoyable
的类型 Exercisable
。创建该接口的匿名 classes 再次合法。