Мне нелегко переносить мою голову вокруг Java универсальные типы. Вот простая часть кода, который в моем уме должен работать, но я, очевидно, делаю что-то не так.
Eclipse сообщает об этой ошибке в BreweryList.java:
The method breweryMethod() is undefined for the type <T>
Идея состоит в том, чтобы заполнить Вектор объектами-экземплярами, которые являются подклассом класса Пивоваренного завода, таким образом, вызов был бы чем-то как:
BreweryList breweryList = new BreweryList(BrewerySubClass.class, list);
BreweryList.java
package com.beerme.test;
import java.util.Vector;
public class BreweryList<T extends Brewery> extends Vector<T> {
public BreweryList(Class<T> c, Object[] j) {
super();
for (int i = 0; i < j.length; i++) {
T item = c.newInstance();
// breweryMethod() is an instance method
// of Brewery, of which <T> is a subclass (right?)
c.breweryMethod();
// "The method breweryMethod() is undefined
// for the type <T>"
}
}
}
Brewery.java
package com.beerme.test;
public class Brewery {
public Brewery() {
super();
}
protected void breweryMethod() {
}
}
BrewerySubClass.java
package com.beerme.test;
public class BrewerySubClass extends Brewery {
public BrewerySubClass() {
super();
}
public void brewerySubClassMethod() {
}
}
Я уверен, что это - вопрос о полном новичке дженериков, но я застреваю. Спасибо за любые подсказки!
item.breweryMethod();
вместо
c.breweryMethod();
Вы пытались вызвать метод в Class
, а не в экземпляре.
И на самом деле, Eclipse сообщает
Метод пивоварниMethod() не определен для типа Class
и из этого сообщения должно быть ясно, что произошло.
(И после того, как вы исправите это, вам также придется обрабатывать исключения, объявленные Class.newInstance()
)
Как предложил Том Хотин в комментарии, вам лучше использовать фабричный метод вместо отражения в вашем методе, чтобы создать свой объект.
Разве вы не имеете в виду:
item.breweryMethod();
вместо:
c.breweryMethod();
?
Прежде всего, чтобы ответить на ваш вопрос: в цикле должно быть item.breweryMethod ();
вместо c.breweryMethod ();
Я не знаю, что вы планирую сделать, но это не кажется лучшим подходом. Вот несколько предложений, как вы могли бы улучшить свой код:
Vector
на ArrayList
если вам не нужно синхронизировать список Помимо возможной опечатки, упомянутой выше ... Я не вижу такого метода initBreweryFromObject ()
, определенного где-либо в вашем примере код. Это ошибка, не так ли?