をパラメータ化タイプを使用して:スカラ - 私は次のコードをコンパイルしようとしているパラメータ化型の内側に
case class Settings(settingsList:List[Setting])
abstract class Setting[T](name:String, value:T)
をしかし、コンパイラは文句:
Error:(9, 54) class Setting takes type parameters
case class Settings(settingsList:List[Setting])
^
を同等のJavaコードがsucesfullyコンパイル:
public class Settings {
List<Setting> settingsList;
}
abstract class Setting<T> {
abstract T getValue();
abstract String getName();
}
このような動作を許さないスケーラについてはどういう違いがありますか?
分散の混乱は、必ずしも最良のアイディアではありません。設定の実装の詳細によっては、共分散が意味をなさない場合があり、設計が制限されます。ワイルドカードは行く方法のようです。 –
@UlysseMizrahiそれは「混乱」ではありません。私はそれが理にかなっている分散を持つ型に常に注釈を付けることをお勧めします。これがサブタイプベースのシステムの仕組みです。Scalaは不変のデータ構造を好むので、これはかなり意味があります。これが不可能な場合は、私が指摘したように、実在の(ワイルドカード)タイプを使用することができます。 –
"これはサブタイプベースのシステムの仕組みです" - これは単純に真実ではなく、共分散は実際には不変性に関連していますが、共分散はメソッドパラメータの型を使用できないことを意味します(不変構造)。さらに、分散は型設計の点で実際の意味を有する。 Setting [List [Int]]をSetting [Iterable [Int]]にしますか?デザインの観点からは意味をなさないかもしれません。 –