Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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 是什么导致“操作数类型不兼容”错误?_Java_Casting_Compiler Errors_Operators_Type Conversion - Fatal编程技术网

Java 是什么导致“操作数类型不兼容”错误?

Java 是什么导致“操作数类型不兼容”错误?,java,casting,compiler-errors,operators,type-conversion,Java,Casting,Compiler Errors,Operators,Type Conversion,我试图通过一个类实现iSortableStack接口 这是我的主要功能 public class SampleStack<E> { E ch; @SuppressWarnings("unchecked") public static void main(String[] args) throws IOException { ISortableStack<Character> s = new SortableStack<Cha

我试图通过一个类实现iSortableStack接口

这是我的主要功能

public class SampleStack<E> {
    E ch;

    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws IOException {
        ISortableStack<Character> s = new SortableStack<Character>();
        SampleStack demo = new SampleStack();
        while ((demo.ch == System.in.read()) != '\n')
            if (!s.isFull())
                s.push((Character) demo.ch);
        while (!s.isEmpty())
            System.out.print(s.pop());
        System.out.println();
    }
}
错误:操作数类型Object和int不兼容

这里出了什么问题?

SampleStack.ch的类型为E。E是由您的类型参数指定的对象。由于您没有指定类型参数,编译器会为您放入对象。如果你想让ch成为一个角色,你会想要SampleStack demo=newsamplestack;或者在Java 7中,SampleStack demo=new SampleStack

SampleStack.ch属于类型E。E是由类型参数指定的对象。由于您没有指定类型参数,编译器会为您放入对象。如果你想让ch成为一个角色,你会想要SampleStack demo=newsamplestack;或者在Java 7中,SampleStack demo=new SampleStack

当您想要=赋值时,您有==相等测试。您从未实际分配到demo.ch。相等性测试返回布尔值,而不是字符,因此返回错误消息

您还需要将System.in.read的结果从整数转换为字符,或者使用SampleStack或类似的方法。

您需要=赋值时有==相等测试。您从未实际分配到demo.ch。相等性测试返回布尔值,而不是字符,因此返回错误消息


您还需要将System.in.read的结果从整数转换为字符,或者使用SampleStack或类似的东西。

实例化SampleStack时,您没有提供类型参数,因此demo.ch属于Object类型。这显然是无法比较或分配的,我怀疑您实际上是想这样做的,无论如何,从System.in.的int中可以看出。

您在实例化SampleStack时没有提供类型参数,因此demo.ch属于Object类型。这显然是无法比较或分配的,我怀疑您实际上想做的,不管怎么说,从系统的int值来看。在。

中,此代码中有几个错误:

正如人们指出的那样,您正在创建一个泛型类,但您没有对其进行泛化和原始使用,您需要:

样品钉

即使您更改了它,它也不会像您所做的那样运行==而不是=

即使您更改了以上两个参数,它也无法工作,因为System.in.read返回的是一个int而不是一个字符,您需要生成一个整数堆栈,或者将输入值读取到一个变量,然后将其强制转换,但这不是一个好的做法。我会使用扫描仪或类似的东西来读取用户输入的内容,如下所示:

扫描仪sc=新的扫描系统.in; char c=sc.nextChar


此代码中有几个错误:

正如人们指出的那样,您正在创建一个泛型类,但您没有对其进行泛化和原始使用,您需要:

样品钉

即使您更改了它,它也不会像您所做的那样运行==而不是=

即使您更改了以上两个参数,它也无法工作,因为System.in.read返回的是一个int而不是一个字符,您需要生成一个整数堆栈,或者将输入值读取到一个变量,然后将其强制转换,但这不是一个好的做法。我会使用扫描仪或类似的东西来读取用户输入的内容,如下所示:

扫描仪sc=新的扫描系统.in; char c=sc.nextChar


这里有两个与泛型无关的严重问题

首先,demo.ch==System.in.read是一个布尔表达式。读取int的结果将自动装箱为整数,并且将根据demo.ch测试该对象的标识,demo.ch为null

我想这里需要的是赋值运算符,=。这将把读取结果分配给demo.ch

下一个问题是,根据您使用的类型转换,您似乎希望demo.ch是一个角色。但是,您正在尝试将读取结果分配给int。基元类型可以在必要时自动装箱,也就是说,它们可以转换为类似字符或整数的包装器对象,但仅当要转换的值是可以由目标类型表示的常量表达式时。这里,值是可变的,因此不能隐式执行转换

您可以通过显式地将读取结果强制转换为字符,然后让自动装箱将其转换为字符来解决此问题,但这将隐藏EOF,EOF由-1值表示。我建议改为使用类似的方法:

while (true) {
  int ch = System.in.read();
  if ((ch < 0) || (ch == '\n'))
    break;
  if (!s.isFull())
    s.push((char) ch);
 }

请注意,这里根本不使用demo,因此其类型参数的问题与此无关。

这里有两个与泛型无关的严重问题

首先,demo.ch==System.in.read是一个布尔表达式。读取int的结果将自动装箱为整数,并且将根据demo.ch测试该对象的标识,demo.ch为null

我想这里需要的是赋值运算符,=。这将把读取结果分配给demo.ch

下一个问题是,您似乎希望demo.ch是一个字符 基于您正在使用的类型转换的acter。但是,您正在尝试将读取结果分配给int。基元类型可以在必要时自动装箱,也就是说,它们可以转换为类似字符或整数的包装器对象,但仅当要转换的值是可以由目标类型表示的常量表达式时。这里,值是可变的,因此不能隐式执行转换

您可以通过显式地将读取结果强制转换为字符,然后让自动装箱将其转换为字符来解决此问题,但这将隐藏EOF,EOF由-1值表示。我建议改为使用类似的方法:

while (true) {
  int ch = System.in.read();
  if ((ch < 0) || (ch == '\n'))
    break;
  if (!s.isFull())
    s.push((char) ch);
 }

请注意,我们在这里根本不使用demo,因此其类型参数的问题与此无关。

如果您将demo声明为SampleStack?而不是像使用@SuppressWarningUnchecked那样抑制警告,您应该听从编译器的建议。如果你不明白这个建议,那么你应该仔细阅读,直到你做到这一点,这是你正在做的,在这里问,一个很好的选择。一般来说:除非您知道警告的含义,否则不要忽略它们。除了术语上的矛盾之外,可排序堆栈究竟是什么?如果您将demo声明为SampleStack?而不是像使用@SuppressWarningUnchecked那样抑制警告,您应该听从编译器的建议。如果你不明白这个建议,那么你应该仔细阅读,直到你做到这一点,这是你正在做的,在这里问,一个很好的选择。一般来说:除非你知道警告的含义,否则不要忽略它们。除了术语上的矛盾之外,什么是可排序堆栈?井型铸造是一个选项,但有更好的选项,如扫描仪类。井型铸造是一个选项,但有更好的选项,如扫描仪类。请注意,字符c;c=int 3;确实是定义好了,并且工作得很好。然而,你所说的其余部分都是合理的,特别是关于将阅读结果自动装箱的危险。@Ernest Friedman Hill:这很有趣,我没有意识到,我仍然不完全理解那里发生了什么。似乎只有当int-rvalue可以静态地确定为适合char而不缩小时,该赋值才有效。例如,c=int-1和c=int 65536不起作用。此外,分析是局部的;int i=3;c=i;在这种情况下不起作用。你知道JLS在哪里讨论过这个问题吗?我想在第5.2节“赋值转换”的讨论中讨论过这个问题:如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用窄化原语转换。@Ernest:这肯定涵盖了它!谢谢你的参考。注意字符c;c=int 3;确实是定义好了,并且工作得很好。然而,你所说的其余部分都是合理的,特别是关于将阅读结果自动装箱的危险。@Ernest Friedman Hill:这很有趣,我没有意识到,我仍然不完全理解那里发生了什么。似乎只有当int-rvalue可以静态地确定为适合char而不缩小时,该赋值才有效。例如,c=int-1和c=int 65536不起作用。此外,分析是局部的;int i=3;c=i;在这种情况下不起作用。你知道JLS在哪里讨论过这个问题吗?我想在第5.2节“赋值转换”的讨论中讨论过这个问题:如果变量的类型是byte、short或char,并且常量表达式的值可以用变量的类型表示,则可以使用窄化原语转换。@Ernest:这肯定涵盖了它!谢谢你的推荐。