Java 如何修复要删除的代码-Xlint:编译时未检查的警告

Java 如何修复要删除的代码-Xlint:编译时未检查的警告,java,generics,compilation,warnings,Java,Generics,Compilation,Warnings,可能重复: 当我使用-Xlint:unchecked编译时,我的程序可以正确编译和工作,但我正在寻求帮助以删除此警告。感谢您的帮助!多谢各位 这是警告: java: warning: [unchecked] unchecked cast found : E required: java.lang.Comparable<E> ^^^^ java:警告:[未选中]未选中强制转换 发现:E 必需:java.lang.com

可能重复:

当我使用-Xlint:unchecked编译时,我的程序可以正确编译和工作,但我正在寻求帮助以删除此警告。感谢您的帮助!多谢各位

这是警告:

java: warning: [unchecked] unchecked cast
found   : E
required: java.lang.Comparable<E>

                            ^^^^
java:警告:[未选中]未选中强制转换
发现:E
必需:java.lang.com
^^^^
发出警告的代码为:

public boolean contains(E obj) {

    Node<E> curr = head;

        while (curr != null) {
                return true;
            }

            curr = curr.next;
        }

        return false;
    }
public boolean contains(E obj){
节点电流=头部;
while(curr!=null){
返回true;
}
curr=curr.next;
}
返回false;
}

在调用obj上的
compareTo
方法时,应按如下方式更改contains方法的签名,以避免任何类型转换:

public <E extends Comparable<E>> boolean contains(E obj)
{
    return true;
}
public boolean contains(E obj)
{
返回true;
}

这还将强制任何传递给contains方法的E都已经实现了可比较的接口。

这似乎是
contains(…)
方法的一个有缺陷的实现。对象不必是可比较的,它们只能是相等的。只需使用
等于(…)
即可:

public boolean contains(E obj) {
    Node<E> curr = head;

    while (curr != null) {
        if (curr.data.equals(obj)) {
            return true;
        }
        curr = curr.next();
    }

    return false;
}
public class SomeClass<E extends Comparable<E>> {

    public boolean contains(E obj) {
        Node<E> curr = head;
        while (curr != null) {
        if (obj.compareTo(curr.data) == 0) {
                return true;
            }
            curr = curr.next;
        }
        return false;
    }

    //the rest of your implementation...
}
public boolean contains(E obj){
节点电流=头部;
while(curr!=null){
if(当前数据等于(obj)){
返回true;
}
curr=curr.next();
}
返回false;
}

如果您假设类中的所有数据都必须实现
Compariable
接口,那么您应该将其添加到类声明中,否则在未实现此接口的类中使用此方法时,您可能会得到
ClassCastException

public class SomeClass<E extends Comparable<E>> {

    public boolean contains(E obj) {
        Node<E> curr = head;
        while (curr != null) {
        if (obj.compareTo(curr.data) == 0) {
                return true;
            }
            curr = curr.next;
        }
        return false;
    }

    //the rest of your implementation...
}
公共类SomeClass{
公共布尔包含(E obj){
节点电流=头部;
while(curr!=null){
如果(对象比较到(当前数据)==0){
返回true;
}
curr=curr.next;
}
返回false;
}
//实现的其余部分。。。
}

我认为这行不通,因为他似乎正在实现
列表
接口,所以他无法更改方法签名。我无法从这个问题中看出他正在实现列表?@JakeKing OP没有说他的类正在实现
列表
接口。@Vikdor根据OP的实际代码,
很笨拙,因为类有
模板。呃,我想没有。很公平。检查这个问题:@Petradulin在这种情况下,它是不一样的。如果调用
contains
方法时
E
类未实现
Comparable
接口,则这可能会导致
ClassCastException
。请不要编辑您的问题以删除其所有内容,即使它已作为副本关闭(在本例中,我不同意@LuiggiMendoza的答案,我认为@LuiggiMendoza的答案最有可能是合适的)它应该留在原处,以便在结束之前编写的答案仍然有意义。这不是一个好的解决方案,它迫使
类实现
公共布尔等于(对象o)
方法,可能OP根本不需要它。@LuiggiMendoza
对象
包含一个默认的
等于(对象)
,它通过引用进行比较(aka
=
)默认情况下。这将使用该实现,除非子类重写它。这是一个更好的解决方案,因为它不需要不必要地使用可比较的接口,并且它对所有对象使用内置方法。可能OP类不实现
equals
方法,而是通过查看
E
类应该执行的代码实现
Comparable
。我们应该引导OP找到更好的解决方案,而不是在实际代码中添加这样的限制。@LuiggiMendoza实现Comparable的类应该实现
等于(…),但也许不是相反的方法。如果一个可比较的对象没有实现相等,我认为它是一个设计缺陷和不合逻辑的。强烈地建议,但不是严格要求的(x.Copabto(y)=0)=(x.ras(y)),它可能是一个缺陷,或者可能不是,但这超出了这个问题的范围。