gpt4 book ai didi

java - 是什么导致了 Java 类转换异常错误?

转载 作者:行者123 更新时间:2023-12-01 16:41:49 25 4
gpt4 key购买 nike

我的教授让我们实现 Java 类似接口(interface),以帮助我的二叉搜索树比较包含所扫描单词的单词对象,然后将该单词与其他单词进行比较,但无论出于何种原因,我正在做的第二个是抛出一个错误。我确实知道他给我们使用的方法确实在这里进行了强制转换 (TreeComparable) ,但我仍然不能 100% 确定为什么这是编译器卡住的行并给我错误

java.lang.ClassCastException: class ObjectTreeNode cannot be cast to class 
TreeComparable (ObjectTreeNode and TreeComparable are in unnamed module of loader java.net.URLClassLoader

这就是导致它的方法

public void insertBSTDup(Object o) {
ObjectTreeNode p, q;

ObjectTreeNode r = new ObjectTreeNode(o);
if (root == null)
root = r;
else {
p = root;
q = root;
while (q != null && ((TreeComparable)(r.getInfo())).compareTo(p.getInfo()) != 0) { <---------
p = q;
if (((TreeComparable)(r.getInfo())).compareTo(p.getInfo()) < 0)
q = p.getLeft();
else
q = p.getRight();
}
if (((TreeComparable)(r.getInfo())).compareTo(p.getInfo()) < 0)
setLeftChild(p, r);
else if (((TreeComparable)(r.getInfo())).compareTo(p.getInfo()) > 0)
setRightChild(p, r);
else ((TreeComparable)(p.getInfo())).operate(r.getInfo());
}
}

到目前为止,我的 Word 类是这样的,compareTo 方法位于底部,它的实现方式与我在第一个作业中执行的第一个compareTo 类似,它正在比较单词字符串,因此它知道它会在哪里被添加。

public class Word implements TreeComparable
{
private String word;
private ObjectList list = new ObjectList();
private ObjectListNode obj;
private int numberOfTimes = 1, LineNumber, position;


public Word(String word, int LineNumber, int position)
{
this.word = word;
this.LineNumber = LineNumber;
this.position = position;
}

public int compareTo(Object o)
{
Word w = (Word) o;
return word.compareTo(w.getWord());
}

public String getWord()
{
return word;
}

这是 treeComparable 方法

public interface TreeComparable
{
public int compareTo(Object O);
public void operate(Object O);
public void visit();
}

除了删除 treeComparable 转换之外,我可以更改什么来消除该错误,我必须在该项目中继续这样做

此外,这是 Word 对象将进入的 objectTreeNode 对象

public class ObjectTreeNode implements ObjectTreeNodeInterface
{
private Object info;
private ObjectTreeNode left;
private ObjectTreeNode right;

public ObjectTreeNode() {
info = null;
left = null;
right = null;
}

public ObjectTreeNode (Object o) {
info = o;
left = null;
right = null;
}

public void setInfo(Object o) {
info = o;
}

public Object getInfo() {
return info;
}

public void setLeft(ObjectTreeNode p) {
left = p;
}

public ObjectTreeNode getLeft() {
return left;
}

public void setRight(ObjectTreeNode p) {
right = p;
}

public ObjectTreeNode getRight() {
return right;
}
}

这是主要内容

public static void main(String args[]) throws IOException
{
Hash h = new Hash();
Word w;
ObjectBinaryTree bt = new ObjectBinaryTree();
ObjectTreeNode node;
Scanner in = new Scanner(new File("getty.txt"));
PrintWriter pw = new PrintWriter(new FileWriter("csis.txt"));
int numberOfLines = 1;
//h.check();


while(in.hasNext())
{
String word = in.nextLine();
String[] ar = word.split(" ", 0);

System.out.print("\n" + (numberOfLines++) + ": ");
int i = 0;
while(i < ar.length)
{
char check = ar[i].charAt(ar[i].length() - 1);
if(check == ',' || check == '.' || check == '!' || check == '?')
{
ar[i] = ar[i].substring(0, ar[i].length() - 1);
}
w = new Word(ar[i], numberOfLines, (i + 1));
node = new ObjectTreeNode(w);
//System.out.println(ar[i]);
bt.insertBSTDup(node);
System.out.print("(" + (i + 1) + ") " + ar[i] + " ");
i++;
}
}
}

最佳答案

您的 insertBSTDup 方法期望 getInfo 的每个返回值都是 TreeCompareable 类型。它还接受一个对象作为输入参数,该对象可能是要插入的对象,因此也应该是一个TreeCompareable。事实上,您立即将其包装在 ObjectTreeNode 中:

public void insertBSTDup(Object o) {
ObjectTreeNode p, q;

ObjectTreeNode r = new ObjectTreeNode(o);

但是,当您调用 insertBSTDup 时,您不会传入 Word 对象(该对象将实现 TreeComparable) > 但用 ObjectTreeNode 代替:

            node = new ObjectTreeNode(w);
bt.insertBSTDup(node);

因此要么insertBSTDup的参数更改为ObjectTreeNode并再次摆脱包装或者传递w 插入 insertBSTDup 而不是 Node

从更一般的意义上来说,当您确实期望时,如果您不只是将对象作为参数,那么大部分情况都可以避免。 >树可比较。这样,编译器就会告诉您 ObjectTreeNode 不是 TreeComparable,而不是仅在运行时发生问题。

基本上每个使用Object的地方都应该是TreeComparable。事实上,如果您已经了解了它们,您可能应该使用泛型类型。

关于java - 是什么导致了 Java 类转换异常错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61849042/

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