расширение класса с помощью универсального типа, Java - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь сделать следующее в Java:

public class ClassName<E> extends E

Делая это, однако, я получаю:

error: unexpected type

Это просто случай, что Javaне могу сделать это?- и если да, то как я добьюсь этого эффекта?Он работает безупречно в C ++, с шаблонами, подобными:

template<typename E>
class ClassName: public E

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

Ответы [ 4 ]

7 голосов
/ 26 августа 2011

Хорошо это или плохо, в Java нет множественного наследования.Дженерики в Java гораздо больше, чем в C++.Они просто дают вам безопасность при компиляции.Во время выполнения общая информация стирается.

2 голосов
/ 26 августа 2011

В шаблонах C ++ создаются различные классы, создаваемые во время компиляции, то есть для каждого E вы получите различную версию ClassName.

В Java у вас есть один класс с этим именем, и универсальный тип не используется для гораздо большего, чем проверка типов во время компиляции. Таким образом, Java не может позволить вам расширяться от типа E, так как в этом случае компилятору придется создавать несколько экземпляров.

Кроме того, универсальные типы также могут быть интерфейсами, и class ClassName extends Serializable не будет компилироваться вообще. :)

0 голосов
/ 26 августа 2011

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

0 голосов
/ 26 августа 2011

Java не может этого сделать - это из-за стирания типа. Когда класс Java компилируется, универсальный тип (E) изменяется на какой-то конкретный класс / интерфейс - компилятор должен уметь определять, что это за тип. Кроме того, Java не поддерживает множественное наследование - класс может расширять только один класс (но он может реализовывать несколько интерфейсов).

...