在扩展另一个类的类中的可变不可见性

时间:2017-02-17 04:36:56

标签: java class polymorphism

我有几个课程:bookvideo,其中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弹出一个错误,bookvideo变量不属于班级item

为什么扩展项的类中的变量不可见?如何访问这些变量?

2 个答案:

答案 0 :(得分:2)

问题是newItem的类型为item。虽然bookvideo都是item,但反过来却不正确。

如果希望编译器查看子类中声明的变量,则需要在访问其变量之前将newItem强制转换为相应的子类。这可以在您每次需要时完成,但最好您需要说book b = new book()而不是item newItem = new book()

答案 1 :(得分:1)

父类无法知道其子字段是什么。要获得对这些字段的正确访问权限,而不是实例化item,您需要分别实例化videobook,然后将其中的每一个添加到列表中。这也意味着您无法在add个语句的末尾使用if方法,因为它们需要添加到if内。

由于它是一个混合层次结构集合,您可以编写List<? super item> theList = new ArrayList<>();并以这种方式添加元素。