[英]incompatible types: java.lang.Object cannot be converted to java.lang.String
[英]incompatible types: java.lang.Object cannot be converted to java.lang.String?
我目前是Java新手,沒有任何編程經驗,我目前正在嘗試編寫大學面試中提出的問題的解決方案:)
//Winner rabbit variable to hold the winner of the 'race'
String winner;
winner = yettoracequeue.element();
問題背景:
我不明白為什么當結果是字符串(例如Rabbit)時,尚未將yettoracequeue.element()視為對象,因此我無法將其分配給優勝者的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();
}
}
您需要一個類型轉換:
winner = (String) yettoracequeue.element();
說明:您聲明yettoracequeue
變量的方式是,對象Queue
; 也就是說, 可以包含任何對象的隊列。 您已經將String
對象添加到隊列中,但是可以將任何類型的對象放入隊列中。
因此,當您調用yettoracequeue.element()
,編譯器僅知道該對象將是java.lang.Object
的實例或某個子類。 (這是因為每個對象都是java.lang.Object
或某個子類的實例!)
但是,當您將值分配給winner
,系統需要知道您分配的對象實際上是String
。 (如果還有其他問題,則無法對它進行String
特定的操作。)
那么類型轉換是做什么的呢?
好(String) yettoracequeue.element()
進行運行時類型檢查。 它檢查方法調用返回的對象是否確實是字符串:
如果運行時類型檢查成功,則將表達式的類型視為String
...,並且分配有效。
如果運行時類型檢查失敗,則運行時系統將引發ClassCastException
...,並且您的程序通常會失敗。
實際上,在這種特殊情況下,有更好的方法來解決該問題。 Queue
類型實際上是通用類型; 即你可以給它一個類型參數。 看起來像這樣:
Queue<String> yettoracequeue = new LinkedList<>();
我現在已經聲明yettoracequeue
是一個包含String
對象的隊列。 如果我這樣做,那么:
當我嘗試向隊列中添加(例如)一個Integer
對象時,會出現編譯錯誤。
當我調用yettoracequeue.element()
,編譯器將知道隊列僅包含String
對象,並且在將結果分配給String
變量時不會堅持使用yettoracequeue.element()
類型轉換。
您的代碼中的問題是,隊列是原始類型,而不是String隊列。 為了避免類型錯誤,您必須提供通用類型參數:
Queue<String> yettoracequeue = new LinkedList<String>();
// ^^^^^^
您可以在Oracle教程中閱讀有關泛型的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.