我已经重写了在以下链接中找到的二进制搜索树代码,可以正常工作-该类可与任何类型参数一起使用。
http://www.informatics.susx.ac.uk/courses/dats/DataStructures/SearchTree.java
http://www.informatics.susx.ac.uk/courses/dats/teach/code/demos/SearchTreeDemo.java

我将通用SearchTree.java放在名为mysearchtree的程序包中,并将其导入SearchTreeDemo.java。

SearchTree.java包含:
抽象类SearchTree。
具体类EmptyTree,具有受保护的构造函数。
具体的类NodeTree,它也具有受保护的构造函数。

SearchTree抽象类的原始非通用编码是,代码的客户端将通过以下静态方法实例化EmptyTree对象:

public abstract class SearchTree {
    /**
     * Returns an empty tree.
     */
    public static SearchTree empty() {
        return new EmptyTree();
    }

    // more code
}


可以这样使用:

SearchTree t = SearchTree.empty();
t = t.add( new String("hello") );


使用泛型时,我已将类重写为具有以下结构:

public abstract class SearchTree<T extends Comparable<T>> {
    public abstract boolean isEmpty();
    public abstract int numNodes();
    public abstract boolean contains(T key);
    public abstract SearchTree<T> add(T item);
    public abstract SearchTree<T> remove(T item);
    public abstract String toString();
}


提供将返回EmptyTree的静态方法的原始计划将无法正常使用(您不能在静态方法中使用该类的通用类型参数)。

我的问题是:如何提供一种类型安全的方法,以允许该代码的客户端从程序包外部实例化EmptyTree(或其他等效的机制,以替换SearchTree t = SearchTree.empty()代码)?

更新:

我尝试了以下操作,但收到错误消息:

public static <U> SearchTree<U> createSearchTree() { return new EmptyTree<U>(); }


错误:

./mysearchtree/SearchTree.java:7: type parameter U is not within its bound
    public static <U> SearchTree<U> createSearchTree() { return new EmptyTree<U>(); }
                                 ^
./mysearchtree/SearchTree.java:7: type parameter U is not within its bound
    public static <U> SearchTree<U> createSearchTree() { return new EmptyTree<U>(); }
                                                                              ^
2 errors

最佳答案

您正在寻找类似这样的东西吗?参数化方法。

public static <Y extends Comparable<Y>> SearchTree<Y> empty() {
   return new SearchTree<Y>();
}

关于java - 从外部包实例化 protected 类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7965815/

10-09 05:54