Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以说;如果类别A是类别B的子类别,则类别A必须是类别B的子类别;?_Java_Scala_Subclassing_Type Systems_Subtyping - Fatal编程技术网

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
extends
B

泛型类不是简单的类型,而是类型构造函数(即更高级的类型)。因此:

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
是一个类。