Почему Java не позволяет расширять параметры типа? - PullRequest
2 голосов
/ 18 апреля 2020

Почему этот код не компилируется?

public class Wrapper<T> extends T {}

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

Я мог бы представить, что вы можете использовать его для создания public class Persistent<T> extends T {}, который позволит вам, например, расширить T с некоторыми функциональность для сериализации T в байтовый массив и сохранения его на диске, в то же время позволяя передавать экземпляры Persistent<T> функциям, которые в противном случае принимали бы только значения типа T.

. это было бы возможно: РЕДАКТИРОВАТЬ: это было бы невозможно, поскольку не могло быть разумной реализации для load() (как правильно указано michid). Чтобы не испортить его комментарий, я оставлю его здесь.

Integer i1 = Integer.valueOf(5);
Persistent<Integer> i2= new Persistent<Integer>();
i2.load(i1) //example method to load i1 into i2, basically serializing it

List<Integer> myIntegers = new ArrayList<>();
famousPeople.add(i1);
famousPeople.add(i2);

1 Ответ

3 голосов
/ 18 апреля 2020

Когда вы extend класс, вы расширяете существующие функциональные возможности за счет некоторых дополнительных функций, предоставляемых суперклассом. Когда суперкласс T, это может быть что угодно, но вы не можете знать, что. Так как бы вы расширили то, о чем ничего не знаете?

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