java - 如何避免使用通配符对继承的递归类进行强制转换?

标签 java inheritance recursion polymorphism

1) 假设你有如下的抽象类定义:

abstract class AbstractBinaryTree<T> {
    AbstractBinaryTree<T> parent;
    AbstractBinaryTree<T> leftChild;
    AbstractBinaryTree<T> rightChild;
    T value;     
}

以及使用以前未声明或未实现的新方法实现此类:

public class BinarySearchTree<T extends Comparable<T>> extends AbstractBinaryTree<T> {
    public BinarySearchTree(T pVal) {
        super(pVal);
    }


    public Boolean isBST(){
    if(leftChild != null && rightChild != null){
        return (leftChild.value.compareTo(value) < 0 
                && rightChild.value.compareTo(value) >= 0 )
                && ((BinarySearchTree<T>) leftChild).isBST() 
                && ((BinarySearchTree<T>) rightChild).isBST();
    }
    else if(leftChild != null){
        return leftChild.value.compareTo(value) < 0 
                && ((BinarySearchTree<T>) leftChild).isBST() ;
    }
    else if (rightChild != null){
        return rightChild.value.compareTo(value) >= 0
        && ((BinarySearchTree<T>) rightChild).isBST();
    }
    else{
        return true;
    }
}

如何避免强制转换所有左 child 和右 child ?

2) 同样假设我在 AbstractBinaryTree 中有以下抽象定义:

    public abstract AbstractBinaryTree<T> findMinTree();

及其在 BST 中的实现:

/***
 * @return the subtree rooted at the min value
 */
public BinarySearchTree<T> findMinTree(){
    if(leftChild != null)
        return (BinarySearchTree<T>) leftChild.findMinTree();
    return this;
}

如何避免在

中强制转换
public BinarySearchTree<T> findMinTree(){
    if(leftChild != null)
        return (BinarySearchTree<T>) leftChild.findMinTree();
    return this;
}

或者当我给 child 打电话时?

BinarySearchTree<T> y = ((BinarySearchTree<T>) x.rightChild).findMinTree();

我对类型转换不过敏,但在这种情况下它非常重。 预先感谢您的回答!

最佳答案

您可以使用更多泛型,即 CRTP :

abstract class AbstractBinaryTree<T, TTree extends AbstractBinaryTree<T, TTree>> {
    TTree parent;
    TTree leftChild;
    TTree rightChild;
    T value;     
}

关于java - 如何避免使用通配符对继承的递归类进行强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26184075/

相关文章:

java - 尽管用户已登录,Android firebase 数据库权限仍被拒绝

python - 如何在继承树中多次包装子方法?

xcode - NSOpenPanel在选择文件时崩溃

c++ - 寻找最小楼梯成本的动态规划问题的错误答案

c - 在递归函数中使用堆栈

java - Spring 对象创建和 @autowiring 注解

Java bytebuffer 将三个字节转换为int

C++ : CRTP destructor?

c++如何在实例化类时为模板参数分配默认值

java - 在 Applet 上绘图而不扩展 Applet 类