未经检查的具有可比接口和通用列表的强制转换警告

时间:2013-02-22 00:49:07

标签: java list generics comparable

当我使用具有通用或参数化列表的Comparable接口时,我收到了未经检查的强制转换警告。我可以使用ObjectList进行比较,但不能使用通用列表。这是我的开发,首先使用ObjectList,然后使用通用List。

这是我的ListNode类定义的片段:

public class ListNode {
    private Object info;
    private ListNode next;

和我的ObjectList类定义的片段:

public class ObjectList {
    private ListNode list;

和我的Comparable界面:

public interface Comparable {
    public int compareTo(Object o);
}

我的ObjectList类中有一个方法,它将Object参数与ListNode中的Object进行比较,没有任何问题。这是比较代码:

if (((Comparable)o).compareTo(p.getInfo()) == 0)

我现在正在尝试创建一个通用的List类并进行类似的比较。这是我的通用ListNode类定义的片段:

public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;

和我的通用List类定义的片段:

public class List<Type> {
    private ListNode<Type> list;

和我的通用Comparable接口:

public interface Comparable<Type> {
    public int compareTo(Type t);
}

当我尝试与我的ObjectList类进行相同的比较时,我从我的通用List类中得到未经检查的强制转换警告:

List.java:239:警告:[未选中]未经检查的强制转换 发现:类型 必需:可比较

if (((Comparable<Type>)t).compareTo(p.getInfo()) == 0)

有什么想法吗?

这是一些简化的代码:

public class List<Type> {
    public class ListNode<Type> {
        private Type info;
        private ListNode<Type> next;

        public ListNode() {
            info = null;
            next = null;
        }
    }

    private ListNode<Type> list;

    public List() {
        list = null;
    }

    public boolean contains(Type t) {
        ListNode<Type> p = list;
        while (p != null && (((Comparable<Type>)t).compareTo(p.info) != 0))
            p = p.next;
        return p != null;
    }
}



public interface Comparable<Type> {
        public int compareTo(Type t);
}

将有界参数添加到列表类:

public class List<Type extends Comparable<Type>> {

解决了警告问题。但是创建String对象列表会产生以下错误:

类型参数java.lang.string不在其绑定范围内

2 个答案:

答案 0 :(得分:2)

为什么你需要创建自己的Comparable接口,而JDK中已有一个接口?无法创建String of List的原因很简单,因为String没有自己的Comparable接口。它只实现了java.lang.Comparable。只需做一些重命名,事情就会清楚:你在做什么:

public interface MyComparable<Type> {
    public int compareTo(Type t);
}

public class MyList<Type extends MyComparable<Type>> {
  //....
}

然后您尝试创建MyList<String>变量

String未实施MyComparable,当然这会导致问题。

答案 1 :(得分:0)

首先将List声明更改为以下代码。这使得参数化类型必须是Comparable。

List<Type extends Comparable<Type>>

然后您可以直接致电t.compareTo(p.info)而无需演员表。其次,将ListNode类移动到自己的文件中。

相关问题