Java 具有可比界面和通用列表的未选中强制类型转换警告
当我使用带有泛型或参数化列表的可比较接口时,会收到未选中强制转换警告。我可以使用ObjectList进行比较,但不能使用泛型列表。这是我的发展,首先是一个ObjectList,然后是一个generic List 下面是我的ListNode类定义的一个片段: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
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难堪的