1

subtypeとの関係についてはある程度理解していsubclassますが、それが正しいかどうかはわかりません。

具体的なクラス (ジェネリック/高次クラスではない)

Java や Scala で具体的なクラスや型を宣言するとします。

class B

class A extends B

classAが class のサブクラスである場合B、 typeは type ?Aのサブタイプでなければなりません。B

また、 typeAが type のサブタイプの場合B、 classAは class のサブクラスB? A(とBが両方のクラスであると仮定)

しかし、それらは具象クラスまたは型である場合にのみ真です

高次のクラス/型

しかし、高次の型の場合、これは当てはまりませんよね? 言う:

class A[+T]

次に、 typeA[String]は type のサブタイプですA[Object]A[String]、 のサブクラスではありませんA[Object]よね?

4

1 に答える 1

3

質問のすべてにほぼ「はい」 -以下で説明するように、ジェネリック クラスであってもAandをサブタイプとして記述できます。B

A「 subclasses B」と「Asubtypes B」が同等でない可能性があるのは、次の 2 つの場合のみです。

1、特性/インターフェースは継承階層の一部にすることができますが、クラスとして記述することはできません。したがって、サブクラス化関係の一部にすることはできません。Aextends のように、「 extends 」を使用して、このより一般的な関係を表現できますB

2. ジェネリック クラスは単純な型ではなく、型コンストラクタ (つまり、より高次の型) です。だから:

class B[T]
class A[T] extends B[T]

A[T]「サブタイプB[T]」と言うのは正しいですがA[T]、 とB[T]はクラスではなく、サブクラス化の関係を持つことはできません。A「サブクラスB」と「Aサブタイプ」と言うのは正しいBですが、この場合はより高次の型の間の関係を記述しています。

Scala では、Java とは異なり、型パラメーターを共変または反変として宣言できることに注意してください。class C[-T, +U]と 2 つのタイプAとサブタイプがある場合B、サブタイプがありますが、明らかにサブクラス化の関係はありません。ABC[B, A]C[A, B]

于 2014-06-23T01:43:43.220 に答える