Java 我可以说;如果类别A是类别B的子类别,则类别A必须是类别B的子类别;?
我对Java 我可以说;如果类别A是类别B的子类别,则类别A必须是类别B的子类别;?,java,scala,subclassing,type-systems,subtyping,Java,Scala,Subclassing,Type Systems,Subtyping,我对子类型和子类之间的关系有一些了解,但我不确定它们是否正确 混凝土类(非通用类/高阶类) 比如在Java或Scala中,如果我声明了一些具体的类或类型: class B class A extends B 如果类A是类B的子类,那么类型A必须是类型B的子类型 而且,如果类型A是类型B的子类型,那么类A是类B的子类?(假设A和B都是类) 但只有当它是具体的类或类型时,它们才是真的 高阶类/类型 但对于高阶类型,这不是真的,对吗?说: class A[+T] 那么类型A[String]是类型
子类型
和子类
之间的关系有一些了解,但我不确定它们是否正确
混凝土类(非通用类/高阶类)
比如在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
”可能不等效:
特性/接口可以是继承层次结构的一部分,但不能被描述为类,因此不能是子类关系的一部分。您可以使用“extends”来表示这种更一般的关系,如A
extendsB
泛型类不是简单的类型,而是类型构造函数(即更高级的类型)。因此:
class B[T]
class A[T] extends B[T]
正确的说法是“A[T]
子类型B[T]
”,但是A[T]
和B[T]
不是类,不能有子类关系。正确的说法是“A
子类B
”和“A
子类型B
”,但在本例中,您描述的是更高级类型之间的关系
请注意,Scala与Java不同,它允许将类型参数声明为协变量或反变量。如果你有
类C[-T,+U]
和两种类型A
和B
和A
子类型B
,那么C[B,A]
子类型C[A,B]
,但显然没有子类关系。Java没有“类型”的概念,除了标量原语(不能被子类型)之外.我们不能像讨论Scala那样讨论Java的泛型。他们做事方式不同。选择一个。@HotLicks不正确;在Java中,类和接口都是类型。@chrylis-在这种情况下,“类”和“类型”本质上是同义的(除了标量),因此这个问题是没有意义的。@hotlick即使在Java中,“类”和“类型”也是不同的概念。接口是类型,但不是类ArrayList
是一个类型,但不是一个类,即使ArrayList
是一个类。