Конструктор Java, использующий универсальные типы

Мне нелегко переносить мою голову вокруг 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() {
    }
}

Я уверен, что это - вопрос о полном новичке дженериков, но я застреваю. Спасибо за любые подсказки!

5
задан Beer Me 16 March 2010 в 18:42
поделиться

4 ответа

item.breweryMethod();

вместо

c.breweryMethod();

Вы пытались вызвать метод в Class, а не в экземпляре.

И на самом деле, Eclipse сообщает

Метод пивоварниMethod() не определен для типа Class

и из этого сообщения должно быть ясно, что произошло.

(И после того, как вы исправите это, вам также придется обрабатывать исключения, объявленные Class.newInstance())

Как предложил Том Хотин в комментарии, вам лучше использовать фабричный метод вместо отражения в вашем методе, чтобы создать свой объект.

9
ответ дан 18 December 2019 в 10:44
поделиться

Разве вы не имеете в виду:

item.breweryMethod();

вместо:

c.breweryMethod();

?

4
ответ дан 18 December 2019 в 10:44
поделиться

Прежде всего, чтобы ответить на ваш вопрос: в цикле должно быть item.breweryMethod (); вместо c.breweryMethod ();

Я не знаю, что вы планирую сделать, но это не кажется лучшим подходом. Вот несколько предложений, как вы могли бы улучшить свой код:

  • Замените Vector на ArrayList если вам не нужно синхронизировать список
  • Вместо расширения реализации List рассмотрите , используя список, или ваш BreweryList предоставляет больше функциональных возможностей, чем стандартный список?
2
ответ дан 18 December 2019 в 10:44
поделиться

Помимо возможной опечатки, упомянутой выше ... Я не вижу такого метода initBreweryFromObject () , определенного где-либо в вашем примере код. Это ошибка, не так ли?

1
ответ дан 18 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: