gpt4 book ai didi

java - 警告 : unchecked call to compareTo(T) as a member of the raw type java. lang.Comparable

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:28:26 29 4
gpt4 key购买 nike

我正在创建一个使用二叉搜索树实现通用 Set 的类。我在我的几个方法中使用了“compareTo”方法,无论我做什么,我都会不断收到规定的警告。感谢您的帮助!

// Allow short name access to following classes
import csc143.data_structures.*;

public class MySet<E> implements SimpleSet<E> {

// the root of the "tree" that structures the set
private BTNode root;
// the current number of elements in the set
private int numElems;

public MySet() {
root = null;

numElems = 0;
}

/**
* Add an element to the set.
*
* @param e The element to be added to the set.
* @return <tt>true</tt> If this operation updated the contents of the set.
*/
public boolean add(E e) {
try {
root = addToSubtree(root, (Comparable) e);
return true;
} catch(DuplicateAdded exc) {
// duplicate trying to be added
return false;
}

}

// This helper method adds the element "e" to tree rooted at r. Returns
// (possibly new) tree containing "e", or throws DuplicateAdded exception
// if "e" already exists in tree.
private BTNode addToSubtree(BTNode r, Comparable elem)
throws DuplicateAdded {
if(r == null) {
return new BTNode(elem);
}

int compare = elem.compareTo(r.item);
// element already in tree
if(compare == 0) {
throw new DuplicateAdded("Element is already in set");
}
if(compare < 0) {
r.left = addToSubtree(r.left, elem);
} else { // compare > 0
r.right = addToSubtree(r.right, elem);
}

// element has been added
return r;
}

/**
* Remove all elements from this set.
*/
public void clear() {
root = null;

numElems = 0;
}

/**
* Checks for the existance of the specified value within the set.
*
* @param e The value sought.
* @return <tt>true</tt> If the value exists in the set.
*/
public boolean contains(E e) {
return subtreeContains(root, (Comparable) e);
}

// This helper method returns whether element "elem" is in
// (sub-)tree with root "r".
private boolean subtreeContains(BTNode r, Comparable elem) {
if(r == null) {
return false;
} else {
int compare = elem.compareTo(r.item);
// found element
if(compare == 0){
return true;
} else if(compare < 0) {
return subtreeContains(r.left, elem);
} else { // compare > 0
return subtreeContains(r.right, elem);
}

}

}

/**
* Check for the existance of elements in the set.
*
* @return <tt>true</tt> If there are no elements in the set.
*/
public boolean isEmpty() {
return root == null;
}

/**
* Return the number of elements in the set.
*
* @return The number of elements in the set.
*/
public int size() {
return numElems;
}

/**
* Returns a String representation of the contents of the set.
*
* @return The String representation of the set.
*/
public String toString() {

}

// this inner class creates the node that compose the binary tree structure
class BTNode<E> {

/**
* The item stored in the node.
*/
public E item;

/**
* The node to the left of "this" node.
*/
public BTNode left;

/**
* The node to the right of "this" node.
*/
public BTNode right;

/**
* Constructs the BTNode object (three parameters).
*
* @param item The item to be stored in the node.
* @param left The node to the left of "this" node.
* @param right The node to the right of "this" node.
*/
@SuppressWarnings("unchecked")
public BTNode(Object item, BTNode left, BTNode right) {
// bind to references
this.item = (E) item;
this.left = left;
this.right = right;
}

/**
* Constructs the BTNode (one parameter).
*
* @param The item to be stored in the node.
*/
public BTNode(Object item) {
// call three parameter constructor
this(item, null, null);
}

}

}

编辑:包括SimpleSet接口(interface):

package csc143.data_structures;

public interface SimpleSet<E> {

/**
* Add an element to the set.
*
* @param e The element to be added to the set.
* @return <tt>true</tt> If this operation updated the contents of the set.
*/
public boolean add(E e);

/**
* Remove all elements from this set.
*/
public void clear();

/**
* Checks for the existance of the specified value within the set.
*
* @param e The value sought.
* @return <tt>true</tt> If the value exists in the set.
*/
public boolean contains(E e);

/**
* Check for the existance of elements in the set.
*
* @return <tt>true</tt> If there are no elements in the set.
*/
public boolean isEmpty();

/**
* Return the number of elements in the set.
*
* @return The number of elements in the set.
*/
public int size();

/**
* Returns a String representation of the contents of the set.
*
* @return The String representation of the set.
*/
public String toString();

}

最佳答案

您方法上的签名使用原始 Comparable没有泛型的接口(interface)。您的 set 实现中似乎要求数据类型实现 Comparable , 所以既然你现在使用的是泛型,你应该全面地做出改变。

您没有发布 SimpleSet 的类声明, 所以 ComparableE 的限制可能已经在那里了。如果不是,您需要将类声明更改为:

public class MySet<E extends Comparable<? super E>> implements SimpleSet<E>

这会告诉您的类的客户只有实现 Comparable 的类型允许作为集合实现的泛型类型参数。您没有发布 BTNode 的代码, 但它可能需要在 E 上进行参数化以及 ( BTNode<E> )。

现在,因为您只允许 E 类型的对象要添加到集合中,您应该更改加法器方法以反射(reflect)这一点:

private BTNode<E> addToSubtree(BTNode<E> r, E elem) throws DuplicateAdded

以此类推,对于subtreeContains , 等等。 Java泛型的要点是,你用类型占位符( Comparable 代表元素)替换所有这些地方(到 E ,在你的情况下),在编译时限制可以添加的内容,所以废除最需要显式转换。泛型是一个强大但复杂的特性,我推荐阅读 the official tutorial .

关于java - 警告 : unchecked call to compareTo(T) as a member of the raw type java. lang.Comparable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18143305/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com