Java 具有可比界面和通用列表的未选中强制类型转换警告

Java 具有可比界面和通用列表的未选中强制类型转换警告,java,list,generics,comparable,Java,List,Generics,Comparable,当我使用带有泛型或参数化列表的可比较接口时,会收到未选中强制转换警告。我可以使用ObjectList进行比较,但不能使用泛型列表。这是我的发展,首先是一个ObjectList,然后是一个generic List 下面是我的ListNode类定义的一个片段: public class ListNode { private Object info; private ListNode next; public class ObjectList { private ListNo

当我使用带有泛型或参数化列表的可比较接口时,会收到未选中强制转换警告。我可以使用ObjectList进行比较,但不能使用泛型列表。这是我的发展,首先是一个ObjectList,然后是一个generic List

下面是我的ListNode类定义的一个片段:

public class ListNode {
    private Object info;
    private ListNode next;
public class ObjectList {
    private ListNode list;
public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;
public class List<Type> {
    private ListNode<Type> list;
以及我的ObjectList类定义的一个片段:

public class ListNode {
    private Object info;
    private ListNode next;
public class ObjectList {
    private ListNode list;
public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;
public class List<Type> {
    private ListNode<Type> list;
和我的可比界面:

public interface Comparable {
    public int compareTo(Object o);
}
我的ObjectList类中有一个方法,可以将对象参数与ListNode中的对象进行比较,没有问题。以下是比较代码:

if (((Comparable)o).compareTo(p.getInfo()) == 0)
我现在尝试创建一个泛型列表类并进行类似的比较。下面是我的通用ListNode类定义的一个片段:

public class ListNode {
    private Object info;
    private ListNode next;
public class ObjectList {
    private ListNode list;
public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;
public class List<Type> {
    private ListNode<Type> list;
公共类ListNode{
私有类型信息;
私有listnodenext;
以及我的泛型列表类定义的一个片段:

public class ListNode {
    private Object info;
    private ListNode next;
public class ObjectList {
    private ListNode list;
public class ListNode<Type> {
    private Type info;
    private ListNode<Type> next;
public class List<Type> {
    private ListNode<Type> list;
公共类列表{
私有列表节点列表;
和我的通用可比界面:

public interface Comparable<Type> {
    public int compareTo(Type t);
}
公共接口{
公共国际比较(t型);
}
当我尝试与ObjectList类进行相同的比较时,我从我的泛型列表类中获得以下未选中强制转换警告:

public class List<Type extends Comparable<Type>> {
java:239:警告:[未选中]未选中强制转换 发现:类型 所需:可比

if (((Comparable<Type>)t).compareTo(p.getInfo()) == 0)
if(((可比)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);
}
公共类列表{
公共类列表节点{
私有类型信息;
私有listnodenext;
公共ListNode(){
info=null;
next=null;
}
}
私有列表节点列表;
公开名单(){
列表=空;
}
公共布尔包含(类型t){
ListNode p=列表;
而(p!=null&((可比)t.compareTo(p.info)!=0))
p=p.next;
返回p!=null;
}
}
公共界面可比{
公共国际比较(t型);
}
将有界参数添加到列表类:

public class List<Type extends Comparable<Type>> {
公共类列表{
解决了警告问题。但创建字符串对象列表会产生以下错误:


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

首先将列表声明更改为下面的代码。这样,参数化类型必须具有可比性

List<Type extends Comparable<Type>>
列表

然后可以调用
t.compareTo(p.info)
不使用强制转换直接创建。其次,将ListNode类移动到它自己的文件中。

为什么在JDK中已经有一个接口的情况下需要创建自己的
Compariable
接口?无法创建字符串列表的原因很简单,因为字符串没有承载自己的Compariable接口。它只实现了java.lang.Compariable.只要做一些重命名,事情就会清楚:你正在做的是:

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

public class MyList<Type extends MyComparable<Type>> {
  //....
}
公共接口MyComparable{
公共国际比较(t型);
}
公共类MyList{
//....
}
然后您试图创建一个
MyList
变量


String
没有实现
MyComparable
,当然这是造成问题的原因。

t将在某些客户端代码中声明:List sList=new List();不使用JDK。为向我的类演示而开发通用列表。ListNode类位于自己的文件中。只是显示为内部类以简化。根据建议添加了有界参数,并省略了不需要的强制转换。不再显示警告消息。但是,在main()中实例化一个简单的字符串列表生成错误:类型参数java.lang.String不在其绑定范围内:List sList=new List();您是否正在尝试使用自己的可比较接口?如果您想使用String,则必须使用java.lang.Comparable。否则,您必须创建自己的String类。我这里没有完整的上下文,但似乎您正在复制许多内置功能:List、Comparable等。为了获得最佳结果,请使用
Type extends Co难堪的