java - 从外部包实例化 protected 类

标签 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,它有一个 protected 构造函数。 具体类 NodeTree,它也有一个 protected 构造函数。

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/

相关文章:

javascript - JS中这两种编码风格有什么区别?

c# - OOP设计: how to model a company which can be a debtor, 债权人、领导还是只是一种关系?

c# - 使用 serilog 解构开放泛型

java - 编写在多线程 Java 环境中更新两个对象的方法的最佳方法?

java - 如果我的 Servlet 实例变量是 StringBuffer 类型,它是线程安全的吗?

java - 如何使用 GroupLayout 来缩进?

java - java中忽略DTD规范有什么影响?

oop - 关于如何处理不同的 "states"的好教程是什么?

java - 如何创建通用子类的实例?出现错误 : "Bound mismatch: The type ... is not a valid substitute for the bounded parameter ..."

c# - 通用实现,但构造函数参数取决于具体类