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
只能在编译其封闭类时进行编译
对于interfaceIA
您可以做的下一件事是将其移动到同一个包中,并使其包私有
另一种方法是将所有内容重新包装到另一个类中,并将接口
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
可能需要通过文件中的这个公共接口来引用,但在我的例子中,这显然只是为了方便(文档和默认方法)。