簡體   English   中英

不兼容的類型:java.lang.Object無法轉換為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();

問題背景:

  1. 將隊列中的第一項分配給字符串變量
  2. 從隊列中刪除第一項
  3. 將隊列中的第二項分配給另一個字符串變量
  4. 比較兩個變量並將答案分配給新變量

我不明白為什么當結果是字符串(例如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM