Java 循环继承和接口-A类can';t实现类B接口,而类B实现接口
我有: 因此,如果我理解正确,循环继承发生的原因是: 编译器转到A并说“嘿,A实现了BListener,让我们去找BListener!” 然后当它试图找到BListener时,它最终找到了B,它说: “嘿,布利斯腾纳,A的需要在B里面!等等!B需要阿利斯泰纳!我们去找阿利斯泰纳!” 然后是一个,重复。我做对了吗Java 循环继承和接口-A类can';t实现类B接口,而类B实现接口,java,android,inheritance,interface,implements,Java,Android,Inheritance,Interface,Implements,我有: 因此,如果我理解正确,循环继承发生的原因是: 编译器转到A并说“嘿,A实现了BListener,让我们去找BListener!” 然后当它试图找到BListener时,它最终找到了B,它说: “嘿,布利斯腾纳,A的需要在B里面!等等!B需要阿利斯泰纳!我们去找阿利斯泰纳!” 然后是一个,重复。我做对了吗 顺便说一句,这个编译错误发生在我的Android开发中。这可能有助于把它画出来 public class A implements BListener { public inte
顺便说一句,这个编译错误发生在我的Android开发中。这可能有助于把它画出来
public class A implements BListener {
public interface AListener {}
}
public class B implements AListener {
public interface BListener {}
}
>A
是/\inherits的一部分
v
阿利斯泰纳·布利斯滕纳
^
继承\/是
B<
一个可爱的圆圈。如果其中一个已存在,则无法创建其中一个
编译程序是一只患有多动症的松鼠,在追逐自己的尾巴吗
没有,因为松鼠不会停下来(直到咖啡因用完)。编译器查找这个,然后放弃
注意:Eclipse有一个允许这种设置的bug。经过进一步调查,我最初是错的 您注意到的行为的技术解释如下 从Java语言规范一章开始 类
C
直接取决于类型T
,前提是中提到了T
扩展了或实现了C
的
子句作为超类或
超级接口,或作为完全限定形式的限定符
超类或超接口名称
类C
取决于参考类型T
,如果满足以下任一条件:
正确:
C
直接依赖于T
C
直接依赖于依赖于(§9.1.3)的接口I
C
直接依赖于依赖于T
(递归使用此定义)的类D
如果类依赖于自身,则为编译时错误。
假设类是在packagecom中声明的,那么让我们以您的代码为例,使用类型使用的完全限定名
>A
is part of / \ inherits
V
AListener BListener
^
inherits \ / is part of
B<
遵循上述JLS中的规则
A
直接依赖于BListener
,因为它在implements
子句中提到了它
A
直接依赖于B
,因为它在超级接口的完全限定名称中被称为限定符(BListener
是com.example.B.BListener
)
B
直接依赖于AListener
,因为它在implements
子句中提到了它
B
直接依赖于A
,因为它在超级接口的完全限定名称中被称为限定符(alitener
是com.example.A.alitener
)
A
直接依赖于依赖于A
的B
因此,A
依赖于A
,应该会发生编译错误
在Eclipse中,如果您限定名称,则会发生错误
public class A implements com.example.B.BListener {
public interface AListener {}
}
public class B implements com.example.A.AListener {
public interface BListener {}
}
但是,如果使用import
语句,则不会。我要和他们开一个漏洞。这是一只非常坚决的松鼠!谢谢,那我就答对了。7分钟内接受。re“是”的一部分;接口不应该是静态的吗?为什么这个问题会被否定?这是怎么回事?你有没有遇到编译错误?哪个编译错误?我仍然在intelliJ.和Maven中得到“涉及com.example.B的循环继承”[ERROR]/home/mlk/code/test_project/src/test/java/com/example/A.java:[4,7]错误:这里涉及
@mlk I的循环继承可能是错误的。Eclipse编译此文件时没有问题。我将进一步调查。@mlk 8,但我认为这无关紧要。这个过程没有改变。@mlk在调查JLS之后,这是Eclipse中的一个错误。在implements
子句中使用限定名更为明显。我已经相应地更新了我的答案。
class A implements B.BListener {
public static interface AListener {
}
}
class B implements A.AListener {
public static interface BListener {
}
}