Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不兼容类型:java.lang.Object无法转换为java.lang.String?_Java - Fatal编程技术网

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

不兼容类型:java.lang.Object无法转换为java.lang.String?,java,Java,我目前是Java新手,之前没有编程经验,我目前正试图为大学面试中提出的一个问题编写一个解决方案:) 问题背景: 将队列中的第一项分配给字符串变量 从队列中删除第一项 将队列中的第二项分配给另一个字符串变量 比较两个变量并将答案分配给新变量 我不明白为什么当结果是字符串(例如Rabbit)时,YetTraceQueue.element()被视为对象,因此我无法将其分配给winner的字符串变量 TIA:) 编辑: 这是完整的代码 package queuepart; import java.uti

我目前是Java新手,之前没有编程经验,我目前正试图为大学面试中提出的一个问题编写一个解决方案:)

问题背景:

  • 将队列中的第一项分配给字符串变量
  • 从队列中删除第一项
  • 将队列中的第二项分配给另一个字符串变量
  • 比较两个变量并将答案分配给新变量
  • 我不明白为什么当结果是字符串(例如Rabbit)时,YetTraceQueue.element()被视为对象,因此我无法将其分配给winner的字符串变量

    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();
    
      }
    }
    

    代码中的问题是队列是原始类型,而不是字符串队列。要避免类型错误,必须提供泛型类型参数:

    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<>();