Конструктор Java с использованием универсальных типов - PullRequest
5 голосов
/ 16 марта 2010

Мне трудно обдумать общие типы Java. Вот простой фрагмент кода, который, на мой взгляд, должен работать, но я, очевидно, что-то делаю не так.

Eclipse сообщает об этой ошибке в BreweryList.java:

.
The method breweryMethod() is undefined for the type <T>

Идея состоит в том, чтобы заполнить Vector экземплярами объектов, которые являются подклассом класса Brewery, поэтому вызов будет выглядеть примерно так:

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() {
    }
}

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

Ответы [ 4 ]

9 голосов
/ 16 марта 2010
item.breweryMethod();

вместо

c.breweryMethod();

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

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

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

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

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

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

4 голосов
/ 16 марта 2010

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

item.breweryMethod();

вместо:

c.breweryMethod();

2 голосов
/ 16 марта 2010

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

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

  • Замените Vector на ArrayList, если вам не нужно синхронизировать список
  • Вместо расширения реализации List, рассмотрите , используя список, или ваш BreweryList предоставляет больше функциональных возможностей, чем стандартный список?
1 голос
/ 17 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...