我有几个课程:book
和video
,其中extend item
:
class item {
int item_num;
String title;
}
class video extends item {
double length;
char rating;
}
class book extends item {
String author;
int year;
}
我有一个值的文本文件,需要插入item
列表中。文本文件如下所示:
v 382 Armageddon 120 P
v 281 Scream 138 R
b 389 Othello Shakespeare 1603
v 101 Cellular 110 P
b 482 Hatchet Paulson 1987
如何读取文件:
list<item> theList;
item newItem;
while(true) {
if(file.isEOF) { break; }
if(file.getChar == 'v') {
newItem = new video();
/* the get___ methods below grab the next value
* in the file. Values tab delimited */
newItem.item_num = file.getInt();
newItem.title = file.getString();
newItem.length = file.getDouble();
newItem.rating = file.getChar();
} else if (file.getChar == 'b') {
newItem = new book();
newItem.item_num = file.getInt();
newItem.title = file.getString();
newItem.author = file.getString();
newItem.year = file.getInt();
}
theList.add(newItem);
}
Netbeans弹出一个错误,book
和video
变量不属于班级item
。
为什么扩展项的类中的变量不可见?如何访问这些变量?
答案 0 :(得分:2)
问题是newItem
的类型为item
。虽然book
和video
都是item
,但反过来却不正确。
如果希望编译器查看子类中声明的变量,则需要在访问其变量之前将newItem
强制转换为相应的子类。这可以在您每次需要时完成,但最好您需要说book b = new book()
而不是item newItem = new book()
。
答案 1 :(得分:1)
父类无法知道其子字段是什么。要获得对这些字段的正确访问权限,而不是实例化item
,您需要分别实例化video
和book
,然后将其中的每一个添加到列表中。这也意味着您无法在add
个语句的末尾使用if
方法,因为它们需要添加到if
内。
由于它是一个混合层次结构集合,您可以编写List<? super item> theList = new ArrayList<>();
并以这种方式添加元素。