0

putScalaからAndroid APIのクラスのメソッドを使おうとしているのですContentValuesが、Scalaにリスト要素の型を絞り込ませる方法がわかりません。例えば ​​:

val a: List[(String, Any)](...)
val cv = new ContentValues
for ((k,v) <- a) cv.put(k,v)

... 「オーバーロードされたputメソッドと代替手段」put(String, String)put(String, Int),...解決できないという大まかなエラーが発生します。

私の直感は、おそらくリフレクションを使用する必要があると言っていますが、それを正確に行う方法がわかりません。ポインターはありますか?

4

2 に答える 2

1

リストのタイプが不正確すぎます。ContentValues.putには多くの型のオーバーロードがありますが、それらはすべて固有のもの ( IntegerFloatなど) であり、 の代替手段はありませんObject

あなたはできる:

  • リストに 1 つの型 (たとえば、) の要素しかない場合に備えて、リストの型をより正確にしIntます。
  • HListを使用しますが、タイプの魔法に注意してください。この場合はやり過ぎかもしれません
  • 最後の手段として、型テストを行います。

    for ((k, v) <- a) v match {
      case n: Int => cv.put(k, v)
      case d: Double => cv.put(k, d)
      //...
    }
    
于 2013-04-03T08:38:25.993 に答える
1

これは、Scala で非常に有名で一般的な問題です。型システムは正しく機能しますが、開発者はそれに慣れていません。

厳密に型指定されたプログラミング言語では、コンパイラが使用している型のルールを検証し、これにより、痛みを伴う実行時エラーが防止されます。リフレクションまたはキャストを使用する場合、型システムを強制することができます。これにより、実行時に予期しないエラーや問題が発生する可能性があります。

あなたが大きな恩恵を受けているルールを破りたいと思うのはなぜですか?正当な理由は、ライブラリを設計していて、内部で何が起こるかを正確に知っている場合です (scala コレクションを参照)。

Any や AnyRef などの型を使用することになった場合は、心配して自問する必要があります。

  • なぜ私は階層を上に行くのですか?
  • 強く型付けされたプログラミング言語に対して、おそらくアンチパターンまたは不適切なコンストラクターを使用していますか?

実際、私はあなたがそうであると思います.なぜあなたがList[(String,Any)]. にデータを入れるのに問題がなかったと仮定しましょう。ContentValues後でそこから何かを抽出する必要が生じたらどうしますか? それが Int か、Double か、Float かをどうやって知ることができますか?

于 2013-04-03T08:51:58.750 に答える