Могу ли я сказать «если класс A является подклассом класса B, тип A должен быть подтипом типа B»?

1

У меня есть некоторые представления о взаимосвязи между 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], правильно?

  • 0
    В Java нет понятия «тип», за исключением скалярных примитивов (которые не могут быть подтипированы).
  • 3
    Мы не можем говорить о дженериках для Java так же, как мы говорим о Scala. Они делают вещи по-другому. Выбери один.
Показать ещё 5 комментариев
Теги:
subclassing
subtyping
type-systems

1 ответ

3

Почти все, что есть в вопросе - вы можете описать 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], но, очевидно, там не существует подклассов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню