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

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;     
}
上一篇:2019世界地球日 | SAP 数字化创新助力保护野生大象和犀牛


下一篇:美国汉堡王将迎来人造肉时代 但供应商并非BeyondMeat