从外部包中实例化受保护的类

时间:2011-11-01 11:34:50

标签: java oop generics

我已经重写了以下链接中的二进制搜索树代码,以便一般地工作 - 该类将使用任何类型参数。 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()代码的其他等效机制)?< / p>

更新

我尝试过以下操作,但收到错误:

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

3 个答案:

答案 0 :(得分:1)

这是你想要的东西吗?参数化方法。

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

答案 1 :(得分:0)

如果构造函数受到保护,我能想到的唯一方法就是单例或工厂模式(后者更符合逻辑)。

答案 2 :(得分:0)

也许将类传递给静态方法?