У меня есть некоторые представления о взаимосвязи между subtype
и subclass
, но я не уверен, что они верны.
Скажем в Java или Scala, если я объявляю некоторые конкретные классы или типы:
class B
class A extends B
Если класс A
является подклассом класса B
, то тип A
должен быть подтипом типа B
?
А также, если тип A
является подтипом типа B
, то класс A
является подклассом класса B
? (предположим, что A
и B
- оба класса)
Но они верны, только если это конкретный класс или типы
Но для типов более высокого порядка это не так, верно? Сказать:
class A[+T]
Тогда тип A[String]
является подтипом типа A[Object]
, но A[String]
не является подклассом A[Object]
, правильно?
Почти все, что есть в вопросе - вы можете описать A
и B
как подтипы, даже если они являются родовыми классами, как я объясняю ниже.
Есть только два пути, что " подклассы A
B
" и " подтипа A
B
" не может быть эквивалентно:
1, Черты/интерфейсы могут быть частью иерархии наследования, но не могут быть описаны как классы и поэтому не могут быть частью отношения подкласса. Вы можете использовать "extends", чтобы выразить это более общее отношение, как в A
extends B
2, Общие классы не являются простыми типами, но являются конструкторами типов (то есть более высокосортными типами). Итак, с:
class B[T]
class A[T] extends B[T]
Правильно сказать, что " A[T]
подтипы B[T]
", но A[T]
и B[T]
не являются классами и не могут иметь подклассическое отношение. Правильно сказать, что " подклассы A
B
", а также, что " подтипа A
B
", но в этом случае вы описываете отношения между высшими-kinded типов.
Обратите внимание, что Scala, в отличие от Java, позволяет объявлять параметры типа co- или контравариантные. Если у вас есть class C[-T, +U]
и два типа A
B
и A
подтипы B
, то C[B, A]
подтипы C[A, B]
, но, очевидно, там не существует подклассов.