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;
    }
}

您如何避免不得不抛弃所有左右孩子?

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;
}

还是当我打电话给孩子时?
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/

10-10 15:52