在界面中嵌套 类 在哪里有用?

Where it is useful to have nested classes in an interface?

什么场景下接口可以嵌套classes?

以下代码是允许且有效的。

public interface Iface {

    void show();

    class ifaceClass {
        int x;

        public ifaceClass() {
            System.out.println(x);
        }
    }
}

我也在努力制作 class ifaceClass 的对象。

编辑:

我可以制作这样的对象

public class Test implements Iface {    

    public static void main(String[] args){
        ifaceClass  ifaceClassObj = new ifaceClass();
    }

    public void show() {    

    }
}

我注意到如果 Test 没有实施 Iface 那么我需要进行以下导入,

import com.jls.Iface.ifaceClass;

但它归结为同样的问题,为什么不将它用作另一个 class。

这种方法有什么区别或增值?

您可以在实现 Iface:

的 class 中创建 ifaceClass 的实例
interface Iface {
    void show();
    class ifaceClass {
        int x;
        public ifaceClass() {
            System.out.println(x);
        }
    }
}

public class Test implements Iface {

    public static void main(String args[]) {
        ifaceClass iface = new ifaceClass();
    }

    @Override
    public void show() {
        // ...
    }
}

如果 class 没有实现接口,只需创建一个这样的实例:

Iface.ifaceClass iface = new Iface.ifaceClass();

为什么要在界面中创建一个 class?基本上出于同样的原因,您在另一个 class 中创建一个 class,将相关的 class 组合在一起。

Where it is useful to have nested classes in an interface?

没有这种情况可以只能满足内class 的界面。在接口中具有内部 class 在语法上是有效的,对于 class 实现接口可以创建 class 的实例,除此之外 Interface.Class 还可以使 class 可访问,因为它根本不能 private

I noticed if Test has not implemented the Iface then I needed following import import com.jls.Iface.ifaceClass;

不一定,如果您的界面可以访问,您的内部 class 将自动变为 accessible.Here 您正在尝试直接访问 class 而无需导入 interface 在这种情况下以下语句需要上面的导入语句。

ifaceClass  ifaceClassObj = new ifaceClass();

But it boiled down to same problem that why not use it as a just another class. What the difference or value addition with this approach

确切地说,创建另一个 class 也可以为您提供相同的便利,而且我在日常编程中从未见过任何用例只能通过 [= 的内部 class 来实现44=] 除了通过界面可访问性外,不提供任何其他功能。

我用过一次,但我认为这是一个 不好的做法 。有一天,我们需要在不同的 classes 中实现一种通用方法,这些方法正在实现接口 say X 并且我们想添加一种额外的方法供所有这些 classes 使用以添加一个对 Object 进行某种检查,它仅检查某些参数和 return boolean,即使该用例可以通过其他方式实现,但 具体来说 它仅适用于实现此接口的 classes 我们在接口中添加了 class 以便我们可以提供该方法来实现 classes.(注意:如今在这种情况下可以使用默认方法而不是内部 class)

在这里,明智的做法是注意在大型项目中,任何人(除了创建者)都不可能注意到任何界面都具有内部 class。因此,在我们实现 class 或手动检查接口之前,我们无法知道接口具有内部 class.