consideran este problema simplificado
interface Item<C extends Container<Item<C>>>
interface Container<I extends Item<Container<I>>>
no funciona, porque subtipos de Container<Item<C>>
son bastante limitados - Container<MyItem>
no es un subtipo de la misma, al igual que List<string>
no es un subtipo de List<Object>
Podemos relajarlo con comodines:
interface Item<C extends Container<? extends Item<C>>>
interface Container<I extends Item<? extends Container<I>>>
Ahora funciona bien
class MyItem implements Item<MyContainer>
class MyContainer implements Container<MyItem>
en su mayoría.También se permite la siguiente declaración, pero no lo que pretende
class HerItem implements Item<MyContainer> // nooo!
Esto se debe a que las limitaciones relajamos demasiado. Bueno, no es un problema realmente serio. Claro, nuestro sistema de tipos no es tan estricto como queremos (no es un sistema de tipos), pero los programadores instintivamente seguirían las restricciones previstas, no se desviejen para escribir cosas raras solo porque pueden hacerlo.
Idealmente, querría un tipo This
, y nuestras limitaciones debido puede ser expresado como
interface Item<C extends Container<This>>>
interface Container<I extends Item<This>>
Dado que no tenemos This
, se podría intentar acercarse a ella por un parámetro de tipo
interface Item<C extends Container<This, C>>, This extends Item<C, This> >
interface Container<I extends Item<This, I>, This extends Container<I, This>>
(o, más simétricamente
interface Item<C extends Container<I, C>>, I extends Item<C, I> >
interface Container<I extends Item<C, I>, C extends Container<I, C>>
) Sin embargo, esto tampoco es realmente ajustado. This
no es realmente el "este tipo". Es posible
class HerItem implements Item<MyContainer, MyItem> // uh?
Una vez más, debemos confiar en la disciplina del programador para no hacer cosas como esa.
¡Parece extraño pero parece funcionar! – Thor
Sí :) Es más extraño para mí porque no puedo explicarlo :)) –