我有个奇怪的问题。我有三节课。书(摘要)和两个子类(小说、非小说类)。我已经创建了一系列参考书。该数组可以容纳两个子类的对象。我有以下小说课的代码。
public class Fiction extends Book{
public Fiction(String title) {
super(title);
setPrice();
}
public void setPrice() {
super.price = 24.99;
}
}
非小说类的“相同”代码
public class Nonfiction extends Book{
public Nonfiction(String title) {
super(title);
setPrice();
}
public void setPrice() {
super.price = 37.99;
}
}
这是主程序。
import javax.swing.JOptionPane;
公共课主课{
公共静态void main(字符串[]args){
Book[] book = new Fiction[6];
for(int i = 0; i<book.length; i++) {
if(i<4) {
String title = JOptionPane.showInputDialog("Enter fiction book, no "+i);
book[i] = new Fiction(title);
} else {
String title = JOptionPane.showInputDialog("Enter non fiction book, no "+i);
book[i] = new Nonfiction(title);
}
}
for(int x = 0; x<book.length; x++) {
System.out.println("Book named "+book[x].getTitle()+" costs "+book[x].getPrice());
}
}
}
出于任何原因,我在这一行得到ArrayStore异常...
book[i] = new Nonfiction(title);
但同样的代码也适用于小说类。我查看了java文档,它说当我试图在数组中存储不同的对象(比如String和Int)时会抛出这个异常,但在本例中,它们都是相同的对象。这两个类都是超类的子类,也就是说,它们属于同一类型。我被起诉了。请帮我一点忙好吗?
替换这个:-
Book[] book = new Fiction[6];
与:-
Book[] book = new Book[6];
通过使用第一种声明方式,您实际上是在告诉编译器Array
将包含虚构
类型的对象,而不是Book
的任何其他子类型
你把自己混淆在:-
Book book = new Fiction();
和
Book[] books = new Fiction[6];
你不能把非小说
放在新小说[6]
中。
你被这样一个事实误导了:你可以将一个虚构
s数组分配给Book[]
(数组协方差)类型的变量
正如你所发现的,这是不可能的,因为一本小说[]
不能被视为一本书[]
。(可变类型不能是协变的)
这是Java的设计缺陷。
因此,我正在创建一个用户API,并尝试在登录前调用getUserByEmail()。我的问题是,我得到了一个不明确的处理程序方法映射为HTTP路径错误。 我知道我的问题与我有一个相同但参数类型不同的GET有关。任何帮助都将不胜感激!
问题内容: 我有一个Animal类和一个名为AnimalExtension的Animal扩展。 这两个类之间的唯一区别是AnimalExtension还有另一个实例变量叫做animalId。Animal没有此实例变量。 我也有自己的数据类型,想要对XML进行封送处理。此数据类型称为AnimalList。在AnimalList内,有一个Animals列表作为实例变量。 animalList可以包含A
问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文
但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会
问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定
背景:对于我的用户,我需要存储一对相同的对象类型(设置),目前我有它像 我正在创建带有设置的KeyValueTypes,并将其添加到列表中(每个用户都有一个列表)。我的设置有一个值字段(它显示了它们是否比其他设置“更重要”),所以我希望基于该字段添加它们,稍后我还需要基于该字段(可能还需要基于名称字段)进行搜索--所以搜索将不得不在列表中查找,然后在KeyValueTypes中查找 问题:什么是最