Java从包含的类继承

Java从包含的类继承,java,inheritance,Java,Inheritance,我的代码中有以下类关系: public class A implements A.IA { private IA value; private static class B implements IA private static class C implements IA private interface IA //implicitly static } 我的IDE告诉我,这是一种涉及a的循环继承形式。我不认为继承本身是循环的,但它们确实有某种循环关系

我的代码中有以下类关系:

public class A implements A.IA
{
    private IA value;

    private static class B implements IA

    private static class C implements IA

    private interface IA //implicitly static
}
我的IDE告诉我,这是一种涉及
a
的循环继承形式。我不认为继承本身是循环的,但它们确实有某种循环关系。 有人能解释一下为什么这是一个问题吗?我理解从非静态成员继承是不可能的,因为非静态方法绑定到其包含类的实例,但是静态成员没有这样的要求。是什么让这种关系让继承变得不可能

注 下面我已经找到了这个问题的部分解决方案,尽管这并不令人满意,因为不再允许
IA
是私有的。虽然我主要是在对上述问题进行解释之后,但我希望有不同的解决方案

public class A implements IA
{
    private IA value;

    private static class B implements IA

    private static class C implements IA
}

interface IA

就像Stultuske在评论中提到的那样,创建一个使用自己定义的接口的类是没有意义的。不过,反过来说也有道理

在成功编译
A.IA
之前,类
A
无法成功编译。另一方面,
A.IA
只能在编译其封闭类时进行编译

对于interface
IA
您可以做的下一件事是将其移动到同一个包中,并使其包私有


另一种方法是将所有内容重新包装到另一个类中,并将接口
IA
移出一层。

我认为在类层次结构中存在一个误解:如果该接口在外部不可见,则向外部公开类a实现的接口是没有意义的。我看不出这有什么实际用途。

你如何看待这种逻辑上的发生?在实现IA之前,IA不可能存在,而在A存在之前,IA不存在。您希望
IA
私有化有什么具体原因吗?这似乎是一个问题。一个粗糙而肮脏的解决方案是将您的工作解决方案包装在
类外部
,允许您设置
私有接口IA
@Stultuske我想我不知道java中类初始化工作的细节,但我认为静态嵌套类不需要等待包含类的实例化。您的论点似乎类似于说一个类不能有自己类型的成员。@Zoeyhewl静态成员不能,但当您说:private interface IA…->这不是静态的。@Stultuske My IDE(IntelliJ Idea)指出,
静态接口
对于内部接口来说是多余的,因此我的注释是“隐式静态的”。代码会在
静态界面
中产生相同的警告。即使对于静态成员也是这样吗?表示静态成员没有此限制,但我可以理解他们是否有此限制。@Zoeyhewl线程开启器的内部接口隐式静态的观点是。@Zoeyhewl提问者。简单地说,编译时静态和非静态没有区别。无论您如何编写类,一个.java文件仍将被编译成一个.class文件;静态成员和非静态成员在编译时的解释方式有着明显的区别(例如,编译器可以选择访问任何非静态成员的静态方法)。你的意思是这种情况不取决于成员是否是静态的吗?@Zoeyhewl这种区别与我们所说的不同。有
静态
或不喜欢的区别就像使用
公共
私有
的区别一样。在本例中,编译器首先尝试编译外部类,然后说“哦,它实现了
IA
,让我们先编译它。编译器只有在编译了
IA
之后才知道
IA
将提供什么样的特征,以便知道如何编译外部类。不幸的是,这不会发生,因为那是它的孩子。这是一个正确的观点。虽然我可以想象这样的情况,
A
B
C
可能需要通过文件中的这个公共接口来引用,但在我的例子中,这显然只是为了方便(文档和默认方法)。