最近、私は分散エイリアスがタイプエイリアスで使用できることに気付きました。ここでPredef
からの例です:タイプエイリアス内の分散アノテーション
type Function[-A, +B] = Function1[A, B]
そして、それを使用することができるところ私は、と思うようになりました。明らかに、分散を反対に変えることはできません。また、不変型を共変または反変として振る舞わせることもできません。 (少なくとも、コンパイラはそれと主張しません)コンパイラは、この
scala> type BrokenFunc[+T, -R] = Function1[T, R]
<console>:7: error: covariant type T occurs in contravariant position in type
[+T, -R]T => R of type BrokenFunc
のように、エラーがスローされます。しかし、あなたはいくつかのバリアント型は不変のように動作することができます。だから、私はList
scala> type InvList[T] = List[T]
defined type alias InvList
の不変のバージョンを作ってみました。しかし、この新しい不変List
はまだそれが元共変バージョンだだけのように振る舞う:
scala> val l: InvList[String] = List("foo")
l: InvList[String] = List(foo)
scala> val anyList: InvList[Any] = l
anyList: InvList[Any] = List(foo)
だから、私は何をしないのですが?型別名の分散注釈の目的は何ですか?あなたは、元の型とは異なる、分散注釈付きの型エイリアスの例を挙げることができますか?
私はまた、彼らは、彼らが(別名)れているものであるので、その型の別名は、「弱い」と言うではないでしょう。私はそれは素晴らしい機能だと思うし、それはJavaで全く欠けているのです。どのくらいの頻度私はすべての必要な結果を伴う専用のクラスを定義することなく、地図<リスト、地図<文字列、ダブル>>のようなもののために短い名前を持っていたかったです。 –
@ThiporKongのWRTポイント1は、私がREPLでそれを試してみましたが、それがOKに動作し、私はそれは良いことだと思います。 wrtポイント2、あなたが正しいです、 "弱い"は誤解を招く言葉かもしれませんが、これまで私がこれまで使用してきた言葉です(例えば、Cのtypedef、Haskellの型名エイリアス)。弱いということは悪い意味ではありません。しかし、私が使用できるより良い言葉がありますか? – Owen
再。機能 - はい、もちろん、あなたは正しいです。私が見たことが分からない。 –