通用可比内部类

时间:2016-03-04 12:54:57

标签: java generic-programming

您好我正在尝试构建一个简单的SelfSortingList。这不是任何现实世界的使用,所以我这样做是为了学习。

public class SelfSortingList<R extends Comparable<R>> {

private Item<R> root;

public SelfSortingList(){
    root=null;
}
public void add(R value){
    if(root==null)
        root=new Item<>(value, null);
    else
        root.addValue(value);
}

@Override
public String toString() {
    return root.toString();
}

/*Inner class*/
private class Item<R extends Comparable<R>> {

    private Item<R> parent, child;
    private R value;

    private Item(R value, Item<R> parent) {
        this.value = value;
        this.parent = parent;
    }

    protected void addValue(R other) {
        if (other.compareTo(this.value) > 0) {
            System.out.println("child add");
            if(child!=null) {
                child.addValue(other);
            }else{
                child = new Item<>(other, this);
            }
        } else {
            Item<R> node = new Item<R>(other,parent);
            if(this!=root) {
                parent.child = node;
            }else{
                root= (Item<R>) node; //This is where i get trouble
            }
            node.child=this;
        }
    }

    @Override
    public String toString() {
        String str = value.toString() + ", ";
        if(child!=null)
            str+=child.toString();
            return str;
        }
    }
}

在addValue方法中,当重新分配父对象的root'值以指向新Item时,我收到以下错误消息: 错误:(41,27)java:不兼容的类型:com.company.SelfSortingList.Node无法转换为com.company.SelfSortingList.Node

所以SelfSortingList.Node无法转换为自己的类型?

我不知道该怎么想这个错误信息。将SelfSortingList和Item的类声明更改为“extends Comparable R”不会改变此事。

2 个答案:

答案 0 :(得分:2)

您收到错误消息,因为类型参数&#34; R&#34;在您的私人班级Item中隐藏了类型参数&#34; R&#34;班级SelfSortingList

重命名内部类的类型参数(例如&#34; S&#34;),您将看到您尝试将类型Item<S>(节点)分配给类型{{1 }}(根)。

答案 1 :(得分:0)

我找到了自己的答案。 而不是说:

root=(Item<R>)node;

我不得不这样投:

root=(SelfSortingList.Item)node;