不兼容类型:java.lang.Object无法转换为java.lang.String?
我目前是Java新手,之前没有编程经验,我目前正试图为大学面试中提出的一个问题编写一个解决方案:) 问题背景:不兼容类型:java.lang.Object无法转换为java.lang.String?,java,Java,我目前是Java新手,之前没有编程经验,我目前正试图为大学面试中提出的一个问题编写一个解决方案:) 问题背景: 将队列中的第一项分配给字符串变量 从队列中删除第一项 将队列中的第二项分配给另一个字符串变量 比较两个变量并将答案分配给新变量 我不明白为什么当结果是字符串(例如Rabbit)时,YetTraceQueue.element()被视为对象,因此我无法将其分配给winner的字符串变量 TIA:) 编辑: 这是完整的代码 package queuepart; import java.uti
package queuepart;
import java.util.*;
public class QueuePart {
static String nextline = System.getProperty("line.separator");
public static void main(String[] args) {
//Step 1: Create LinkedList() to assign to yettoracequeue
Queue yettoracequeue = new LinkedList();
//Step 2: add rabbits to queue
int rabbitno = 1;
yettoracequeue.add("Rabbit" + rabbitno);
rabbitno++;
yettoracequeue.add("Rabbit" + rabbitno);
rabbitno++;
yettoracequeue.add("Rabbit" + rabbitno);
rabbitno++;
yettoracequeue.add("Rabbit" + rabbitno);
rabbitno++;
yettoracequeue.add("Rabbit" + rabbitno);
rabbitno++;
yettoracequeue.add("Rabbit" + rabbitno);
System.out.println(nextline + "Items in the queue" + yettoracequeue + nextline);
//Find first item in queue
System.out.println(nextline + "First item in queue is " + yettoracequeue.element());
//Assign First item in queue to racer
String winner = yettoracequeue.element();
}
}
代码中的问题是队列是原始类型,而不是字符串队列。要避免类型错误,必须提供泛型类型参数:
Queue<String> yettoracequeue = new LinkedList<String>();
// ^^^^^^
Queue yettoracequeue=newlinkedlist();
// ^^^^^^
您可以在中阅读有关泛型类型的更多信息。您需要类型转换:
winner = (String) yettoracequeue.element();
说明:按照您声明
yettoracequeue
变量的方式,您拥有的是对象的Queue
;也就是说,队列可以包含任何类型的对象。您已将String
对象添加到队列中,但可以将任何类型的对象放入队列中
因此,当您调用yettoracequeue.element()
时,编译器只知道该对象将是java.lang.object
或某个子类的实例。(这是因为每个对象都是java.lang.object
或某个子类的实例!)
但是,当您将值分配给winner
时,系统需要知道您分配的对象实际上是一个字符串。(如果是其他内容,则对其执行的特定操作将不起作用。)
那么类型转换做什么呢
嗯,(String)yettoracequeue.element()执行运行时类型检查。它检查方法调用返回的对象是否确实是字符串:
- 如果运行时类型检查成功,则它将表达式的类型视为
String
。。。作业是有效的
- 如果运行时类型检查失败,则运行时系统抛出一个
ClassCastException
。。。你的程序通常会失败
事实上,在这种特殊情况下,有更好的方法来解决问题。队列
类型实际上是泛型类型;i、 你可以给它一个类型参数。看起来是这样的:
Queue<String> yettoracequeue = new LinkedList<>();
Queue yettoracequeue=newlinkedlist();
我现在声明yettoracequeue
是一个包含String
对象的队列。如果我这样做的话:
- 当我尝试向队列添加(比如)一个
整数
对象时,我将得到一个编译错误
- 当我调用
yettoracequeue.element()
时,编译器将知道队列只包含String
对象,并且在我将结果分配给String
变量时不会坚持类型转换
什么类型是yettoracequeue
?一个Rabbit
类不是String
请为yettoracequeue的element()方法显示您的代码我从这里的队列文档中获得element()方法不要使用原始类型,使用queue yettoracequeue=new LinkedList()
,请参阅,谢谢您的详细回复。:)(String)是否实际将YetTraceQueue.element()的结果转换为字符串?或者它实际上只是检查它是否是一个字符串,如果是则继续?我在stackoverflow的其他地方也看到了第二个建议,但我目前正在使用字符串测试我的队列是否工作,然后再将字符串队列更改为对象队列,我想我会遇到很多问题:P再次感谢!它检查它是否已经是一个字符串。没有转换。。。从你的意思来说。
Queue<String> yettoracequeue = new LinkedList<>();