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)),它可能是一个缺陷,或者可能不是,但这超出了这个问题的范围。