7

こんにちは、これの初心者で、インターフェイスにクラスを実装しようとしています。インターフェイスは別のインターフェイスを拡張します。リストを実行してそれを妨害するメソッドを持つクラスを作成しています.2つのインターフェースはこれとは別のものです。

2 つのインターフェイスはそれぞれ別のファイルにありますが、すべてが同じパッケージにあります。これが正しいことを願っています。

次のエラーが表示されます。

クラス doublelinkedlist から:interface expected here

インターフェイス A から:doublelinkedlist.A is already defined in doublelinkedlist, interface expected here

インターフェイス B から:doublelinkedlist.B is already defined in doublelinkedlist

コードクラス:

package doublelinkedlist;

import java.util.*;

public class Doublelinkedlist<T> implements A<T>
{

コード インターフェイス A: ( A.java という別のファイル内)

package doublelinkedlist;

import java.util.Iterator;


public class A<T> { // am I supposed to have a class here? or just have the interface?

  public interface A<T> extends B<T> 
  {

コード インターフェイス B: ( B.java という別のファイル内)

package doublelinkedlist;

public class B<T> {

  public interface B<T> extends Iterable<T> 
  {

クラスには 2 つのインターフェイスのコードがないため、既に定義されているというエラーが表示される理由がわかりません。誰か手がかりを得ましたか?

4

3 に答える 3

7

interface expected hereは、コンパイラが の後にインターフェイスを期待していることを示しますimplements。ここで、クラスを指定します ( の宣言class A<T>が最初に来たため)。

doublelinkedlist.A is already defined in doublelinkedlist, interface expected hereA という名前のクラスと A という名前のクラス内のインターフェイスがあるため、スローされます。両方を同じ名前にすることはできません (B と同じ)。

技術的にはクラス内にインターフェースを含めることはできますが、それは実際には最適な設計ではありません (インターフェースは基礎となるクラスの詳細を抽象化または非表示にすることを目的としていたため、通常はより目に見えるようになっています)。正当な理由がない限り:)

これはおそらくあなたが探しているものです:

Doublelinkedlist.java:

package doublelinkedlist;

import java.util.*;

public class Doublelinkedlist<T> implements A<T>
{...}

A.java:

package doublelinkedlist;

import java.util.Iterator;

public interface A<T> extends B<T> 
{...}

B.java:

package doublelinkedlist;

public interface B<T> extends Iterable<T> 
{...}

インターフェイスに関する詳細情報: http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html

于 2013-10-15T15:05:22.057 に答える
0
public interface Entity{

public int getId();
public void setId(int id);
public int getHealth();
public void setHealth(int health);
}

public class Tank implements Entity{

//without implementing the methods mentioned in Entity you will immediately see a red line //under "Tank" in your IDE saying un-implemented methods. 
}
public class Tank implements Entity{
private int id;
private int health;

public Tank(){..}
public int getId(){
return id;
}
public void setId(int id){
this.id = id;
}
public int getHealth(){
return health;
}
public void setHealth(int health){
this.health = health;
}
}

インターフェイスは、インターフェイスを実装しているクラス間の契約であり、「こんにちは、私を使用するためにサインアップしたので、これらのメソッドを使用して適切に定義することをお勧めします」と言っています。

インターフェイスはメソッド ヘッダーのみを記述しますが、実際には内容を提供しません。インターフェイスを実装するクラスに任されます。

さらに、次の継承を理解してください。クラスはその親クラスの属性とメソッドを継承できますが、同じ子クラスは 2 つの親クラスから直接継承することはできません。ただし、継承元の親クラスから子クラスを継承させることはできます。インターフェイスを実装する別のクラス。ここに例があります

 public interface Entity{
    ...
    }
    public Soldier implements Entity{
    // implements the entity interface,
    //and defines the methods
    }
    public SwordsMan extends Soldiers{
    //this class inherits the methods and attributes of soldier
    //which had also implemented the methods from entity

}

また、インターフェイスをインターフェイスに拡張しようとしていることに言及しています。インターフェイスは実装されたメソッドなしで設計されています。2 つのインターフェイスを使用する場合は、これを行うのが最善です。

public class Aircraft implements Engine, Entity{
//this class then has to implements all methods from Engine and Entity
}
于 2013-10-15T15:08:36.543 に答える
0
public class A<T> { // am I supposed to have a class here? or just have the interface?

public interface A<T> extends B<T> 
{

これはあいまいです。A はインターフェイスですか、それともクラスですか?

「実装」できるのはインターフェースのみです。クラスを実装することはできません。

だから私はあなたの問題がそれらを次のように変更することによって行われると思います:

ファイル DoubleLinkedList.java:

public class Doublelinkedlist<T> implements A<T>
{
 // ... blah blah
}

->クラスはインターフェース A を実装します

ファイル A.java:

public interface A<T> extends B<T> 
{
   // ...
}

-> インターフェイスはインターフェイス B を拡張します

ファイル B.java:

public interface B<T> extends Iterable<T> 
{
   // ...
}

-> インターフェイスはインターフェイス Iterable を拡張します

于 2013-10-15T15:04:49.170 に答える