我目前刚接触Java并且之前没有编程经验,我目前正在尝试为大学访谈期间提出的问题编写解决方案:)
//Winner rabbit variable to hold the winner of the 'race'
String winner;
winner = yettoracequeue.element();
关于问题的背景:
我不明白为什么当结果是一个字符串时,yettoracequeue.element()被认为是一个对象,例如Rabbit,因此我无法将其分配给胜利者的String变量。
TIA:)
编辑:
这是完整的代码
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();
}
}
答案 0 :(得分:4)
你需要一个类型转换:
winner = (String) yettoracequeue.element();
说明:您声明yettoracequeue
变量的方式,您拥有的是Queue
个对象;也就是说,可以包含任何类型对象的队列。您已将String
个对象添加到队列中,但您可以将任何类型的对象放入其中。
因此,当您调用yettoracequeue.element()
时,编译器只知道该对象将成为java.lang.Object
或某个子类的实例。 (这是因为每个对象都是java.lang.Object
或某个子类的实例!)
但是当您将值分配给winner
时,系统需要知道您指定的对象实际上是String
。 (如果是其他内容,则String
上的特定操作将无效。)
那么类型转换会做什么?
好(String) yettoracequeue.element()
执行运行时类型检查。它检查方法调用返回的对象是否真的是一个String:
如果运行时类型检查成功,则它将表达式的类型视为String
...并且赋值有效。
如果运行时类型检查失败,则运行时系统会抛出ClassCastException
...并且您的程序通常会失败。
实际上,在这种特殊情况下,有一种更好的方法可以解决问题。 Queue
类型实际上是泛型类型;即你可以给它一个类型参数。它看起来像这样:
Queue<String> yettoracequeue = new LinkedList<>();
我现在声明yettoracequeue
是一个包含String
个对象的队列。如果我这样做那么:
当我尝试将Integer
对象添加到队列时,我将收到编译错误。
当我调用yettoracequeue.element()
时,编译器将知道队列中只包含String
个对象,并且当我将结果分配给{{{}时,我们不会坚持使用类型转换1}}变量。
答案 1 :(得分:1)
代码中的问题是队列是原始类型而不是队列 of String 。要避免类型错误,您必须提供泛型类型参数:
using (var cnn = new ReliableSqlConnection(connString))
{
using (var cmd = cnn.CreateCommand())
{
using(cnn.Open(){
...
}
}
}
您可以在Tutorial by Oracle中了解有关通用类型的更多信息。