2017-11-12 9 views
0

スカラー型の安全性に問題があります。実際、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を返します。 TAnyRefにキャストすることができません。そのため、上記のエラーメッセージが表示されます。

答えて

1

私はHashMap[String, Any]を使用して、この特定の問題を回避することをお勧めしたい、しかし、あなただけのvalue.get().asInstanceOf[AnyRef]を書くAnyRefにキャストします。もちろん、

data.computeIfAbsent(key, (s: String) => { value.get().asInstanceOf[AnyRef] }) 

AnyRef、ないTを返します。

data.computeIfAbsent(key, (s: String) => { value.get().asInstanceOf[AnyRef] }).asInstanceOf[T] 

で修正できますが、それは安全ではありませんが、そうでない場合は間違いを見つけ出すのに役立ちません。

+0

返事をありがとう。あなたの提案されたソリューションはまだ動作しませんでした。私は新しいメッセージエラー "タイプの不一致があります:見つかった:AnyRefが必要です:"型の不一致の代わりにT "が見つかりました:Tが必要:AnyRef – ecdhe101

+0

あなたは最初の行について話していますか? 2番目は本当にすべきではありません。 –

+0

私は第二のものについて話しています。私は最初のものを試しましたが、どちらも動作しませんでした。 – ecdhe101

1

あなたはScalaでキャスティングをお探しですか?

import java.util.HashMap 
import java.util.function.Supplier 

class MyClass { 

    val data: HashMap[String, AnyRef] = new HashMap[String, AnyRef]() 

    def foo[T <: AnyRef](key: String, value: Supplier[T]): T = synchronized { 

    data.computeIfAbsent(key, (s: String) => value.get()).asInstanceOf[T] 
    } 
} 
+0

これは私が求めているものではありません。スレッドはよりクリアに更新されました。 – ecdhe101

+0

あなたのScalaのバージョンは? 2.12.4では、私のコードがコンパイルされます。なぜあなたはそれを使用できないのですか? –

+0

私は2.11を使用していました。問題は修正されました。ありがとうございました。 – ecdhe101

関連する問題