Подтвердить что ты не робот

Расширение от общего супертипа?

В Java я могу расшириться от универсального супертипа? Согласно этой статье, похоже, что я должен уметь: http://www.ibm.com/developerworks/java/library/j-djc05133.html.

public abstract class MyClass<T> extends T {

Однако, когда я делаю что-то подобное в своем приложении, я получаю следующую ошибку: "Нельзя ссылаться на параметр типа T как супертип".

Кто-нибудь знает, могу ли я перейти от общего супертипа в Java? И, если да, есть ли что-то особенное, чтобы это произошло?

РЕДАКТИРОВАТЬ: Я прочитал статью неправильно. Он фактически обсуждает потенциальные проблемы этого.

4b9b3361

Ответ 1

Вы способны наследовать от супертипа, который имеет общие параметры типа. Например:

public class MyList<T> extends AbstractList<T>

(или даже дать оценки параметров, например):

public class MyStringList extends AbstractList<String>

Вы не можете определить класс с супертипом подстановки. Такая концепция не имеет никакого смысла в Java (и я не уверен, что она имеет большое значение в абстрактном). В вашем примере MonitoredDevice я даже не знаю, какую функциональность вы ожидаете там.

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

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

Изменить: Хорошо, прочитав статью полностью, я вижу, какова мотивация такой декларации. Но, прочитав статью полностью, вы также понимаете, что в настоящее время она не поддерживается Java. Основная причина этого - из-за стирания; такая техника никогда не будет возможна при нынешней механике, и в статье более подробно рассказывается о том, что конкретно мешает этому работать.

Ответ 2

Из этого сообщения об ошибке кажется, что вы пытаетесь перейти от самого параметра типа, который вы не можете сделать, потому что тип стирается во время выполнения. Если это не то, что вы пытаетесь сделать, отправьте свой код.