Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环继承和接口-A类can';t实现类B接口,而类B实现接口_Java_Android_Inheritance_Interface_Implements - Fatal编程技术网

Java 循环继承和接口-A类can';t实现类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

我有:

因此,如果我理解正确,循环继承发生的原因是:

编译器转到A并说“嘿,A实现了BListener,让我们去找BListener!”

然后当它试图找到BListener时,它最终找到了B,它说:

“嘿,布利斯腾纳,A的需要在B里面!等等!B需要阿利斯泰纳!我们去找阿利斯泰纳!”

然后是一个,重复。我做对了吗


顺便说一句,这个编译错误发生在我的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
如果类依赖于自身,则为编译时错误。

假设类是在package
com中声明的,那么让我们以您的代码为例,使用类型使用的完全限定名

              >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 {
    }
}