Тип возвращаемого значения метода шаблона не соответствует возвращаемым экземплярамJAVA

Программисты JAVA общаются здесь
Anonymous
Тип возвращаемого значения метода шаблона не соответствует возвращаемым экземплярам

Сообщение Anonymous »

У меня возникла проблема со статическим методом шаблона в интерфейсе. В интерфейсе нет ничего особенного, но объявление метода немного сложное. Код выглядит так:

Код: Выделить всё

public interface ItemSelectPanelFactory
{
@SafeVarargs
public static 
V createPanel(String label, T... items)
{
V result = null;

if (MAX_RADIO_COUNT < items.length)
{
result = new ItemSelectComboPanel(label, items);
}
else
{
result = new ItemSelectRadioPanel(label, items);
}
return result;
}
}
// one of those classes is declared as:
public class ItemSelectRadioPanel extends JPanel
implements ActionListener, LabeledInput
{...}
// The other looks like
public class ItemSelectComboPanel
extends AbstractLabeledInputComponent
{...}
// but that inheritance chain does also derive from JPanel.
// the other interface declaration is:
public interface LabeledInput
{
public T getValue();
}
Без класса ItemSelectPanelFactory все компилируется нормально. Мой вызов компилятора выглядит так:

Код: Выделить всё

    javac -d obj -Xlint:unchecked  -classpath obj  -sourcepath . . .
Компилятор сообщает только о двух следующих ошибках:

Код: Выделить всё

src/flb/gui/ItemSelectPanelFactory.java:61: error: incompatible types: ItemSelectComboPanel cannot be converted to V
result = new ItemSelectComboPanel(label, items);
^
where T,V are type-variables:
T extends Object declared in method createPanel(String,T...)
V extends JPanel,LabeledInput declared in method createPanel(String,T...)
src/flb/gui/ItemSelectPanelFactory.java:65: error: incompatible types: ItemSelectRadioPanel cannot be converted to V
result = new ItemSelectRadioPanel(label, items);
^
where T,V are type-variables:
T extends Object declared in method createPanel(String,T...)
V extends JPanel,LabeledInput declared in method createPanel(String,T...)
Номера строк соответствуют операторам "result=" в методе. Я вижу возможность того, что компилятор не раскрутит цепочку наследования для класса, который не является прямым потомком JPanel, но и не прямым. Я ожидаю, что это связано с моим определением типа шаблона V, но не понимаю, в чем проблема.

Вернуться в «JAVA»