3

私はジェネリックスの初心者であり、これを達成するための最良の方法を見つけることができません。私が明らかに間違ったことをしている場合は、遠慮なく指摘してください。

interface Node<T> {

    void addOne(Node<T> node);
}

class StringNode implements Node<String> {

    List<StringNode> data = new ArrayList<>();

    /**
     * {@inheritDoc}
     */
    @Override
    public void addOne(Node<String> node) {
        StringNode stringNode = (StringNode) node;
        data.add(stringNode);
    }

}

関数自体を署名publicvoidaddOne(StringNode node)にすることで、addOneの実装でNodeからStringNodeへのダウンキャストを回避する方法を見つけたいと思っていました。インターフェイスの実装でこれを実現するためにノードの定義をどのように変更できるかについてのアイデアはありますか?

すでに尋ねられた質問を検索してみましたが、近いものを見つけることができませんでした。これがすでに議論されている質問へのポインタも大歓迎です。

前もって感謝します!

4

3 に答える 3

3

String と StringNode を別々に使用しているのはなぜですか? 言っていただけませんか

interface Node<T> {

    void addOne(T node);
}

class StringNode implements Node<StringNode> {

    List<StringNode> data = new ArrayList<StringNode>();

    /**
     * {@inheritDoc}
     */
    @Override
    public void addOne(StringNode node) {
        StringNode stringNode =  node;
        data.add(stringNode);
    }

}
于 2012-07-10T07:44:45.907 に答える
2

これは私がそれをやった方法です:

interface Node<T extends Node<T>> {

    void addOne(T node);
}

class StringNode implements Node<StringNode> {

    List<StringNode> data = new ArrayList<StringNode>();

    /**
     * {@inheritDoc}
     */
    @Override
    public void addOne(StringNode node) {
        data.add(node);
    }

}

U-No-Poo の提案に似ていますが、もう少し厳密です (T を実際にノードに強制します)。

于 2012-07-10T07:56:51.200 に答える
1

別のジェネリック パラメータを導入できます。

public interface Node<VALUE_TYPE, SELF> {
  public void addOne(SELF u);
}

public class StringNode implements Node<String, StringNode> {

  @Override
  public void addOne(StringNode u) {
    // TODO Auto-generated method stub  
  }
}

VALUE_TYPE実際の値の型 (この場合は String) が必要なとき、およびSELFその型のノードを渡したいときはいつでも使用します。

于 2012-07-10T07:54:59.277 に答える