Ваш SuperTableFactory
претендует на производство экземпляров Table<SuperRow>
. Это означает, что к какой бы таблице вы не вернулись из нее, вы можете добавить SuperRows
и прочитать SuperRows
.
Однако ваш ITableFactory<ITableRow, Table<ITableRow>>
утверждает, что он создает Table<ITableRows>
- таблицы, которые могут добавлять людиITableRows
to и чтение ITableRows
from.
Но ваша фактическая фабрика таблиц выдает Table<SuperRow>
s - базовое хранилище строк равно SuperRow
. Вы не можете позволить кому-то положить туда старую ITableRow
!
Вот почему ваш каст не удался.
Вы можете обойти это, если избавитесь от "людей, которые могут добавлять строкик таблицам "и обещают, что люди могут только когда-либо читать строки. Тогда не имеет значения, является ли хранилище строк Table
на самом деле SuperRow
, так как люди не могут попытаться поместить туда другие типы строк.
Вы делаете это, делая Table<T>
ковариантны. Но, как вы заметили, классы не могут быть ковариантными, только интерфейсы. Так что вам понадобится ITable<out T>
.