0

まず第一に、私はJavaの経験がほとんどありません。

私の質問に行くと、私は自分のリストを自分のメソッドで実装しています。

 public class MyList<E> implements List<E>{

 private Node<E> head;

 private static class Node<E> {
     private E element; 
     .....
 }

このクラスには、このリストを特定のリストと比較するメソッドがあります。

public boolean equals(List<E> list){
....
}

このメソッドを開始するには、最初にリストの先頭を取得する必要があるため、その後、要素にアクセスしてリストを比較できます。
現在、getHead() メソッドはありません。そこで、実装クラスに以下のメソッドを作成してみました

public Node<E> getHead(){    

コンパイラはシンボルを検出しません。もちろん、最初にインターフェイスで宣言する必要があります。問題は、それを実行しようとすると、インターフェースがノードが何であるかを認識できないことです。だから私はここで行き詰まりに陥っています。

エラーが発生します:

  Cannot find symbol
  symbol  : method getHead()
  location: interface List<E>
    Node<E> lhead = list.getHead();

getHead を実装固有のメソッドにしたいのです。それ、どうやったら出来るの?

実装の内部クラスをインターフェイスに移動できますか? この問題を解決する方法がわかりません、

御時間ありがとうございます

4

3 に答える 3

2

java.util.List作成したカスタムListインターフェイスを実装していますか? 標準クラスを使用している場合は、もちろんコア JDK クラスを変更することはできません。

Listカスタムインターフェースを使用している場合、いくつかの問題が見られます。

  • メソッドequals()は受け入れObjectてダウンキャストする必要があります。それ以外の場合は、オーバーライドする代わりにオーバーロードしています:

    public boolean equals(Object obj) {
      //check type first
      List<E> list = (List<E>)obj;
    
  • Nodeclass は 内でプライベートに定義されていMyListます。インターフェイスにList配置すると、公開されます。

  • 最後に、通常equals()は、表現ではなくコンテンツの観点から定義します。複数のList実装があり、それらが同じデータを同じ順序で保持している限り、リストは等しいと見なされます。headあなたの実装では、抽象化を使用したリストのみが同等です。に頼る代わりにgetHead()、反復子を使用して項目を 1 つずつ比較します。

于 2012-10-01T21:17:53.180 に答える
0

getHead()は実装固有のメソッドであり、インターフェイスには属しません。ただし、これは、インターフェイスの一部として使用することはできず、実装クラスのメソッドとして呼び出す必要があることも意味します。

List<String> myList = new MyList<String>();
myList.getHead() // Wrong. Compiler error.

MyList<String> myList = new MyList<String>();
myList.getHead() // Works :)
List<String> asList = myList; // If you want to work with a List from now on

equalsあなたの場合、を取る必要があるという問題もあります。つまり、実装固有の (または固有の) メソッドObjectを使用する必要がある場合は、型チェックを行う必要があります。List

public boolean equals(Object o)

    if (o == this)
        return true;

    if( o instanceof MyList<E> ){
        MyList<E> myList = (MyList<E>)o;
        // do MyList stuff here ...

    }
    // Things to do if you're comparing something that isn't a `MyList`
    // go here
}
于 2012-10-01T21:17:13.420 に答える
0

好奇心からですが、リスト クラスにはint getSize()andE get(int index)メソッドが必要です (これは通常、リストで使用できます)。これで、サイズが等しいかどうかを確認できます。等しい場合は、リストを反復処理し、要素ごとに (E get(int index)メソッドを使用して) 比較できます。

編集:リファレンス実装

public boolean equals(List<E> other) {
    boolean equal = (getSize() == other.getSize());
    for(int i = 0; i < getSize() && equal; i++) {
        equal = get(i).equals(other.get(i));
    }
    return equal;
}
于 2012-10-01T21:18:50.107 に答える