スカラー型の安全性に問題があります。実際、Javaではジェネリック型をObjectにキャストできました。注釈@SuppressWarning("unchecked")
は仕事をしました。しかし、スカラーでは私はそれを行う方法を見つけるのに苦労しています。私はTypeable
クラスを使ってShapeless
APIを試しましたが、どちらもうまくいきませんでした。ここに私のコードスニペットです:data.computeIfAbsent(x: String, y: Function[ _ >: String, _ <: AnyRef]): AnyRef
:スカラで汎用型をAnyRefにキャストする
class MyClass {
val data: HashMap[String, AnyRef] = new HashMap[String, AnyRef]();
def foo[T](key: String, value: Supplier[T]): T = synchronized {
data.computeIfAbsent(key, (s: String) => { value.get() }) //(1)
//(1) --> The compiler says : type mismatch; found : T required: AnyRef Note that T is unbounded, which means AnyRef is not a known parent.
// Such types can participate in value classes, but instances cannot appear in singleton types or in reference comparisons
}
}
これはdata.computeIfAbsent()
署名です。私がdata.computeIfAbsent()
に与えている関数は、汎用タイプT
を返します。 T
をAnyRef
にキャストすることができません。そのため、上記のエラーメッセージが表示されます。
返事をありがとう。あなたの提案されたソリューションはまだ動作しませんでした。私は新しいメッセージエラー "タイプの不一致があります:見つかった:AnyRefが必要です:"型の不一致の代わりにT "が見つかりました:Tが必要:AnyRef – ecdhe101
あなたは最初の行について話していますか? 2番目は本当にすべきではありません。 –
私は第二のものについて話しています。私は最初のものを試しましたが、どちらも動作しませんでした。 – ecdhe101