1

StringとTreeNodeの2つのタイプの子を格納できるTreeNodeクラスを作成する必要があります。子供の数は固定されていません。

どういうわけか次のようなTreeNodeオブジェクトを作成したいと思います。

TreeNode a = new TreeNode("str", new TreeNode("str2"), "str3"); //Correct
TreeNode b = new TreeNode(a, "str4); //Correct
TreeNode c = new TreeNode(54); //Wrong

コンパイル時にワイルドカードなどを使用して引数の型チェックを行うにはどうすればよいですか?

私の不適切なランタイムソリューション:

private static final boolean debug = "true".equals(System.getProperty("debug"));

public <T> TreeNode (T... childs) {
    if (debug) {
        for (Object child : childs) {
            if (!(child instanceof String || child instanceof TreeNode)) {
                throw new RuntimeException("Type of childs must me Tree or String");
            }
        }
    }
}
4

4 に答える 4

2

ツリーに追加できる単一の基本型を見つけるようにしてください。次に、そこから具体的なノード タイプを派生させます。

abstract class Node { }
class TreeNode extends Node {
  public TreeNode(Node... children) {
    // ...
  }
}
class StringNode extends Node { 
  public StringNode(String value) {
    // ...
  }
}

使用法:

TreeNode a = new TreeNode(
  new StringNode("str"), 
  new TreeNode(new StringNode("str2")), 
  new StringNode("str3"));
于 2012-07-11T19:32:47.653 に答える
2

コンストラクターのパラメーターには特別な意味が必要です。varargs の使用は許容されますが、それらは特殊なケースであると考えられます。そして、あなたの問題は別の方法で解決できます。

public class TreeNode {

   public TreeNode() {
     //crate the object
   }

   public TreeNode addNode(String node, String... nodes) {
    //Do something with string node
    return this;
   }

   public TreeNode addNode(TreeNode node, TreeNode... nodes) {
   //Do something with TreeNode
    return this;
   }
}

たとえば、このように使用できます

TreeNode node = new TreeNode().addNode("One","Two").addNode(node3,node4);

node3 と node4 は TreeNode のインスタンスです。

于 2012-07-11T19:41:56.233 に答える
0

これを試して。

public <T> TreeNode (Object... childs) {
  //code
}
于 2012-07-11T19:31:35.637 に答える
0

コンパイル時の型安全性をある程度移植したい場合は、次のようにします。

public class AorB<A, B> {
  private final Object _instance;
  private final boolean _isA;

  public AorB(A instance) {
    _instance = instance;
    _isA = true;
  }

  public AorB(B instance) {
    _instance = instance;
    _isA = false;
  }

  public A asA() {
    assert _isA;
    return (A) _instance;
  }

  public B asB() {
    assert !_isA;
    return (B) _instance;
  }

  public boolean isA() {
    return _isA;
  }
}

そして、AorB<String, TreeNode>インスタンスを使用します。

asB()インスタンスがA.

public class AorB<A, B> {
  ...
  public interface Handler<A, B> {
    void handle(A instnace);
    void handle(B instance);
  }

  public void handle(Handler<A, B> handler) {
    if (isA()) {
      handler.handle(asA());
    } else {
      handler.handle(asB());
    }
  }
于 2012-07-11T19:37:11.110 に答える