Java 是什么导致“操作数类型不兼容”错误?
我试图通过一个类实现iSortableStack接口 这是我的主要功能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
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:这肯定涵盖了它!谢谢你的推荐。