Похоже, вам нужно решить несколько проблем ...
Во-первых, в addBandMembers (), если он не может найти musicCD.addBand, вам нужно либо определить метод addBand () для Item, либо найти соответствующий класс, который имеет метод addBand () на основе объектов, которые вы можно получить доступ из Item.
Во-вторых, вам нужно понять разницу между методами класса и методами объекта. Методы класса, идентифицируемые ключевым словом «static», работают с базовым классом так, чтобы его использовали все экземпляры этого класса. Например, static foo(x){ this.x = x; }
установит статическую переменную "x" класса, и любой доступ к переменной "x" будет использовать последнее установленное значение из вызова foo () (при условии отсутствия других способов установить x). Таким образом, если у вас есть object1 и object2, оба класса, которые определяют foo, object1.x и object2.x, будут иметь одинаковое расположение в памяти, и оба будут установлены одновременно при вызове foo (). Переменные экземпляра, идентифицируемые явно отсутствующим ключевым словом «static», являются , а не общими. public bar(y){ this.y = y; }
установит другое место в памяти для каждого объекта класса - object1.y будет другим местом в памяти и (потенциально) другим значением, чем object2.y.
В-третьих, «Предмет» - это довольно неописательное имя. Ваша библиотека всегда предназначена для музыки, или вам нужно быть более универсальным? Переименование класса в LibraryItem или Media (как предложено в другом ответе) прояснит ваш код.
В-четвертых, вы не предоставили достаточно информации, чтобы действительно диагностировать происходящее. Когда вы обращаетесь за помощью, вы должны предоставить соответствующие выходные данные (что печатается в конце main?), Классы, в которых определены соответствующие переменные / функции (где определены функции addband () и addBandMembers ()?), И любые сообщения об ошибках. (какую ошибку вы получаете, когда вы раскомментируете любую строку в addband ()?). С полной информацией людям намного легче помочь. Без полной информации люди часто не могут дать действительно хорошие ответы.
В-пятых, вы говорите о касте на Object
, но упоминаете, что не знаете как. Приведение в Java очень похоже на приведение в C ++: Foo myFoo = (Foo)myBar;
. Вы получите ClassCastException во время выполнения, если myBar не является подклассом myFoo , а myFoo не является подклассом myBar. Обратите внимание, что вам не нужно приводить подклассы к их суперклассам, так как JVM уже знает иерархию классов, точно так же, как компилятор знает в C ++. Все классы в Java наследуются от Object, поэтому почти никогда нет необходимости приводить их к Object. С другой стороны, если у вас есть подкласс Item, в котором определена функция addband (), вы можете привести элемент (в основном) к соответствующему подклассу и вызвать метод addband () для приведенного объекта.
CompactDisk cd = (CompactDisk)item;
cd.addband(...);
или вы можете сделать это как однострочник как
((CompactDisk)cd).addband(...);
Первый будет полезен, если вам нужно использовать объект как компакт-диск более одного раза. Второй вариант будет приемлемым, если вам нужно привести только один раз, может быть, два рядом друг с другом - более того, это создает проблемы с читаемостью и обслуживанием.