java - 一个很奇怪的泛型问题。
伊谢尔伦
伊谢尔伦 2017-04-18 10:15:26
[Java讨论组]

在编写红黑树的操作时,使用了泛型进行编程。但是在对根节点进行赋值时,却碰到了很奇怪的问题。

下面是定义的红黑树的对象

public class RBTree<T extends Comparable<T>> {

    private RBNode<T> mRoot;

    public static final boolean RED = true;

    public static final boolean BLACK = false;

    public RBNode<T> getmRoot() {
        return mRoot;
    }

    public void setmRoot(RBNode<T> mRoot) {
        this.mRoot = mRoot;
    }
}

下面是定义的红黑树中节点对象

public class RBNode<T extends Comparable<T>> {
    private RBNode<T> left;
    private RBNode<T> right;
    private RBNode<T> parent;
    private boolean color;
    private T key;

    public RBNode(RBNode<T> left, RBNode<T> right, RBNode<T> parent, boolean color, T key) {
        this.left = left;
        this.right = right;
        this.parent = parent;
        this.color = color;
        this.key = key;
    }

    public RBNode<T> getLeft() {
        return left;
    }

    public void setLeft(RBNode<T> left) {
        this.left = left;
    }

    public RBNode<T> getRight() {
        return right;
    }

    public void setRight(RBNode<T> right) {
        this.right = right;
    }

    public RBNode<T> getParent() {
        return parent;
    }

    public void setParent(RBNode<T> parent) {
        this.parent = parent;
    }

    public boolean isColor() {
        return color;
    }

    public void setColor(boolean color) {
        this.color = color;
    }

    public T getKey() {
        return key;
    }

    public void setKey(T key) {
        this.key = key;
    }
}

在操作类中对红黑树中某个节点进行左旋的过程中报错

public class RBTreeOperation<T extends Comparable<T>> {

    private RBTree<T> rbTree;

    public RBTreeOperation(RBTree<T> rbTree) {
        this.rbTree = rbTree;
    }

    public <T extends Comparable<T>> void leftRoatate(RBNode<T> x){
        RBNode<T> y = x.getRight();
        x.setRight(y.getLeft());
        if (y.getLeft() != null){
            y.getLeft().setParent(x);
        }

        y.setParent(x.getParent());

        if (x.getParent() == null){
            ***rbTree.setmRoot(y);***
        }else {
            if (x.getParent().getLeft() == x){
                x.getParent().setLeft(x);
            }else {
                x.getParent().setRight(x);
            }
        }
        y.setLeft(x);
        x.setParent(y);
    }
}

在rbTree.setmRoot(y)中报错,y的类型不匹配。

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(1)
PHPz

public void leftRoatate(RBNode<T> x)

去掉方法中声明的范型,类里已经对T声明过了,再声明1次就变成另外一个范型参数

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号