匿名扩展类并同时实现接口?

use*_*454 7 java anonymous-class

假设我有一个名为Interface的接口,以及一个名为Base的具体类,为了使事情变得更复杂,有一个需要一些参数的ctor.

我想创建一个扩展Base并实现Interface的匿名类.

就像是

 Interface get()
 {
     return new Base (1, "one") implements Interace() {};
 }
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来很合理,但它不起作用!

(PS:实际上,接口和基础也是通用类:D.但我现在会忽略它)

Jon*_*eet 13

不,你不能用匿名类做到这一点.如果你真的想要,你可以在方法中创建一个命名类:

class Base {
}

interface Interface {
}

public class Test {
    public static void main(String[] args) {
        class Foo extends Base implements Interface {
        };

        Foo x = new Foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

就我个人而言,我通常会自己将其拉入静态嵌套类中,但这是您的选择......


Tud*_*dor 0

这种情况对我来说毫无意义。原因如下:假设类Base是这样的:

class Base {
    public void foo();
}
Run Code Online (Sandbox Code Playgroud)

这是Interface

interface Interface {
    public void bar();
}
Run Code Online (Sandbox Code Playgroud)

现在您想要创建一个匿名类,如下所示:

class MyClass extends Base implements Interface {
}
Run Code Online (Sandbox Code Playgroud)

这意味着MyClass继承(或可能覆盖)bar来自 的方法Base并且必须实现foo来自 的方法Interface。到目前为止一切都很好,你的类有这两种方法。

现在,想想当您从方法返回类型的对象时会发生什么Interface:您只能获得提供的功能Interface,即 method foobar丢失(无法访问)。这使我们分为两种情况:

  1. 扩展Base是没有用的,因为您无法使用它的方法,因为新对象被视为Interface.
  2. Interface还有一个方法foo,但这意味着它Base本身应该实现Interface,所以你可以Base直接扩展:
class Base implements Interface {
    public void foo();
    public void bar();
}

class MyClass extends Base {
}
Run Code Online (Sandbox Code Playgroud)