Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > При выполнении неможет найти конструктор генерикса


Автор: Dims 10.8.2009, 20:00
У меня в классе

Код

public class Compound<M extends Met>
        implements Iterable<M>


был конструктор

Код

public Compound(boolean ordered, M... mets)


Впоследствии я выяснил, что передавать mets мне не нужно. Убрал этот параметр и переделал все места, где этот конструктор вызывался.

И полезли ошибки, причём во время выполнения возникает java.lang.NoSuchMethodError, а компиллятор не ругается.

Я пробую две версии. В первой версии у меня конструктор описан

Код

public Compound(boolean ordered)


во второй версии

Код

public Compound(boolean ordered, M... mets)


причём в коде конструктора mets не используется. Поскольку параметр mets опционален, то по идее, обе версии должны работать одинаково.

Ан нет!

Первая версия не работает в классе

Код

public abstract class Absorbtive
        extends Compound<Met> {


где в конструкторе вызывается super(false)

Вторая версия не работает в классе

Код

public abstract class Operator
        extends Compound {


Я так понимаю, она не может найти конструктор, так как в нём не используется типизированный параметр.

Что делать?

По-моему, это чуть ли не ошибка в то ли в джавамашине, то ли в компилляторе.

Добавлено через 14 минут и 23 секунды
Решил при помощи вот такого шаманства

Код

public <M> Compound(boolean ordered/*, M... mets*/) {


и плюс явное указание параметра базовых генериксов во всех местах.

Не ожидал такой подлянки от джавы.

Неужели баг Джавы?

Я много раз очищал проект НетБинса, включая прямое стирание всех class и jar файлов -- не помогло. Значит, НетБинс не виноват.

Может быть, рантайм где-то по-разному указан, с одним компилируется, а с другим выполняется?

Автор: cube 11.8.2009, 17:45
В вашем примере использовался класс с конструктором Compound(boolean ordered, M... mets), иначе как java машина знала бы о таком классе?

У меня такие ошибки бывают когда классы находятся в разных библиотеках, компилятор здесь не причем, удаление всех библиотек проекта, + clean 'n' bild всех связанных проектов, библиотек - решают эту проблему ;) Сам проверял...

Если вопрос остался, то посмотрите внимательно где вы используете этот класс, как связан этот класс с вашим проектом, какие библиотеки еще используют этот класс и тогда вам все станет ясно ;) удачи!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)