2015-11-25 25 views
5

を実装しながら、クラスAは、私が持っているクラスBのインターフェイスを実装することはできません。巡回継承とインターフェイス - クラスBは、インタフェース

ザ・:

だから、
public class A implements BListener { 
    public interface AListener {} 
} 

public class B implements AListener { 
    public interface BListener {} 
} 

私が正しく理解していれば、巡回継承があるため起こりますコンパイラはAに行き、と言っていますねえ、AはBListenerを実装して、BListenerを見つけよう!

それがBLISTENERを見つけようとするときに、それは最終的にそれが言うBになる:

「ねえ、Aのために必要なBLISTENERは、Bの内側にあるしかし、待っBはAListenerを必要レッツ!!! AListenerを見つけよう!

それから、それが繰り返されます。私はこの権利を得ましたか?

ところで、このコンパイルエラーはAndroid開発で私に起こりました。

+0

なぜこの質問は否定的でしたか? –

+0

_this happened _これは何ですか?コンパイルエラーが発生しましたか?どのコンパイルエラー? –

答えて

6

それを引き出すのに役立つかもしれません。

   >A 
is part of/ \ inherits 
        V    
    AListener  BListener 
     ^
    inherits \ / is part of 
       B< 

美しい円。既に存在するもの以外のものを作成することはできません。

Is the compiler a squirrel with ADHD high on coffee chasing it's own tail?

いいえ、リスは止まらない(カフェインがなくなるまで)。コンパイラはこれを探してから放棄します。

注:Eclipseにはこの設定を可能にするバグがあります。

+0

それは非常に決まったリスです!ありがとう、私はそれを正しく得た。 7分で受け入れます。 –

2

さらなる調査の後、私は最初は間違っていました。

あなたは気づいている行動のための技術的な説明は以下の

あるSuperclasses and subclasses

A class C directly depends on a type T if T is mentioned in the extends or implements clause of C either as a superclass or superinterface, or as a qualifier in the fully qualified form of a superclass or superinterface name.

A class C depends on a reference type T if any of the following is true:

  • C directly depends on T .
  • C directly depends on an interface I that depends (§9.1.3) on T .
  • C directly depends on a class D that depends on T (using this definition recursively).

It is a compile-time error if a class depends on itself.

上のJava言語仕様の章から想定し、タイプの用途のための完全修飾名で、のは、あなたのコードを見てみましょうJLSからのルールに従い

public class A implements com.example.B.BListener { 
    public interface AListener {} 
} 

public class B implements com.example.A.AListener { 
    public interface BListener {} 
} 

:クラスは、パッケージcom.exampleで宣言されましたそれはそのimplements節で述べているため

  • Aの真上に、BListenerに依存します。それがスーパーインタフェースの完全修飾名で修飾子(BListenercom.example.B.BListenerある)それはそのimplements節で述べているため
  • Bが直接、AListenerに依存として挙げられているため
  • Aは直接、Bに依存します。それがスーパーインタフェースの完全修飾名に修飾子として言及されますので、
  • B直接
  • AAListenercom.example.A.AListenerである)、Aに依存直接Aに依存Bに依存します。

したがってAAに依存し、コンパイルエラーが発生するはずです。 Eclipseで


、エラーが発生しますが、名前

class A implements B.BListener { 
    public static interface AListener { 
    } 
} 

class B implements A.AListener { 
    public static interface BListener { 
    } 
} 

を修飾する場合は、importステートメントを使用している場合は、しかし、それはしていません。私はそれらのバグを開くだろう。

+0

私はまだintelliJで "com.example.Bを含む循環的継承"を取得しています。 –

+0

そしてMavenで。 '[ERROR] /home/mlk/code/test_project/src/test/java/com/example/A.java:[4.7]エラー:Aを含む循環継承' –

+0

@mlkここで間違っているかもしれません。 Eclipseはこれを問題なくコンパイルします。私はさらに調査するつもりです。 –

関連する問題