java - 一个很奇怪的泛型问题。

查看:106
本文介绍了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的类型不匹配。

解决方案

public void leftRoatate(RBNode<T> x)

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

这篇关于java - 一个很奇怪的泛型问题。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆