Расширяться от Generic Supertype? - PullRequest
22 голосов
/ 04 января 2010

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

public abstract class MyClass<T> extends T {

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

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

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

Ответы [ 2 ]

11 голосов
/ 04 января 2010

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

public class MyList<T> extends AbstractList<T>

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

public class MyStringList extends AbstractList<String>

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

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

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

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

3 голосов
/ 04 января 2010

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

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