3

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

这是我的 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: 警告: [unchecked] unchecked cast found : Type required: Comparable

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 不在其范围内

4

2 回答 2

2

Why you need to create your own Comparable interface while there is already one in JDK? The reason for fail to create List of String is simply because String didn't bear your own Comparable interface. It has only implemented java.lang.Comparable. Just do some rename and things will be clear: what you are doing is:

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

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

and then you are trying to create a MyList<String> variable

String is not implementing MyComparable, of course it is causing problem.

于 2013-02-22T02:17:49.857 回答
1

首先将您的 List 声明更改为下面的代码。这使得参数化类型必须是可比较的。

List<Type extends Comparable<Type>>

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

于 2013-02-22T00:53:00.357 回答