4

重複の可能性:
Scala: 抽象型とジェネリック

私の理解では、次の 2 つのクラス定義は同じです。では、構文以外の違いは何ですか?

abstract class Container[T] {}
class IntContainer extends Container[Int] {}

abstract class Container2 { type T }
class IntContainer2 extends Container2 { type T = Int }

逆コンパイルされたバイト コードを見ると、最初のセットにはまだジェネリックがあることに気付きます (ただし、 IntContainer は Object: 型として定義されていますpublic class IntContainer extends Container<Object>)。2 番目のセットには、そのような情報はありません。とにかく、すべてのジェネリック型が消去されたと思いました...

PS Scala 2.10-M5 を使用する

4

1 に答える 1

2

抽象型とジェネリックには明確な違いがあり、常に覚えておく必要があります。

  • クラスがジェネリック型の場合、同じクラスの複数のインスタンスが異なるジェネリック型を持つ可能性があります
  • 特定の Scala クラスの抽象型としての具象クラスの場合、その (まさにその) クラスのすべてのインスタンスは同じ抽象型を持ちます。

この 2 つは別の方法で使用できることは明らかです。

  • ジェネリックは主に、コンテナーとして機能する必要があるクラス、または特定のターゲットに対して何らかの操作を実行する必要があるビジネス クラス向けに設計されています。その意味で、ジェネリック パラメーターを使用すると、コンパイル時に型の安全性を確認できます。
  • 抽象型は主に、より高いレベルで動作またはプロパティを定義し、サブクラス化するときにそれを改良するために設計されています。ジェネリックは継承とはほとんど関係ありません

別の観点から見ると、パラメータとして GenericClass[T] および T をメソッドに渡すことは一般的な機能ですが、 ClassWithAbstractTypeT および classWithAbstractType.T を受け取るメソッドを設計することははるかにまれです。実際、パス依存のメソッドがアクティブでない限り、Scala 2.9 でそのようなメソッドをコーディングすることは禁止されています(私の間違いでなければ、2.10 ではデフォルトでアクティブになっています)。

于 2012-08-04T16:19:28.633 に答える