【问题标题】:Unchecked Cast Warning with Comparable Interface and Generic List具有可比接口和通用列表的未经检查的强制转换警告
【发布时间】:2013-02-07 12:44:46
【问题描述】:

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

这是我的 ListNode 类定义的 sn-p:

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

以及我的 ObjectList 类定义的 sn-p:

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 类定义的 sn-p:

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

以及我的通用 List 类定义的 sn-p:

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 找到:类型 要求:可比

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

【问题讨论】:

  • t 将在某些客户端代码中声明: List sList = new List();
  • 不使用 JDK。开发通用列表以向我的班级展示。

标签: java list generics comparable


【解决方案1】:

为什么你需要创建自己的Comparable 接口,而JDK 中已经有一个?创建 String 列表失败的原因仅仅是因为 String 没有承载您自己的 Comparable 接口。它只实现了 java.lang.Comparable。只需进行一些重命名,事情就会很清楚:您正在做的是:

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

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

然后你尝试创建一个MyList&lt;String&gt; 变量

String 没有实现MyComparable,这当然会导致问题。

【讨论】:

    【解决方案2】:

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

    List<Type extends Comparable<Type>>
    

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

    【讨论】:

    • ListNode 类在自己的文件中。只是显示为内部类来简化。按照建议添加了有界参数并省略了不需要的强制转换。没有警告信息了。但是,在 main() 中实例化一个简单的字符串列表会产生错误:类型参数 java.lang.String 不在其范围内: List sList = new List();
    • 您是否尝试使用自己的 Comparable 接口?如果你想使用 String,那么你必须使用 java.lang.Comparable。否则,您将不得不创建自己的 String 类。我在这里没有完整的上下文,但您似乎正在复制许多内置功能:List、Comparable 等。
    • 为了获得最佳效果,请使用Type extends Comparable&lt;? super Type&gt;
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多