不兼容的类型:java.lang.Object无法转换为java.lang.String?

时间:2016-04-02 15:06:05

标签: java

我目前刚接触Java并且之前没有编程经验,我目前正在尝试为大学访谈期间提出的问题编写解决方案:)

//Winner rabbit variable to hold the winner of the 'race'
    String winner;
    winner = yettoracequeue.element();

关于问题的背景:

  1. 将队列中的第一项分配给字符串变量
  2. 从队列中删除第一项
  3. 将队列中的第二项分配给另一个字符串变量
  4. 比较两个变量并将答案分配给新变量
  5. 我不明白为什么当结果是一个字符串时,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();
    
      }
    }
    

2 个答案:

答案 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中了解有关通用类型的更多信息。