2017-03-07 6 views
0

データ型がListに基づいていくつかの変換を実行する必要があるという要件があります。私はList[String]いくつかの変換を適用する必要がありますが、List[Int]を取得する場合、いくつかの異なる変換を適用する必要があると言うことができます。私はList[Any]をとる関数を定義していましたが、データ型をチェックする必要があります。 isInstanceOfを使用しようとしましたが、うまくいきませんでした。リスト内のデータ型を見つけよう

Listのデータ型を確認するにはどうすればよいですか。

def test(list: List[Any]): List[Any] = { 
    if(list.isEmpty) return List() 
    list.head match { 
    case a: String => list.map(str => str.asInstanceOf[String]+"3") 
    case a: Int => list.map(int => int.asInstanceOf[Int]+3) 
    } 
} 

それが最善の解決策ではないのですが、私はあなたの何も表示されない:あなたのリストは、すべての要素に同じ型を持っていると平野スカラ座を使用して、あなたがこのような何かを行うことができると仮定すると、

+0

郵便コードスニペットをあなたが試したものを使用することを示すこと。簡単に言えば、シンプルな型テンプレートを使ってやることができます。さらに強力なものが必要な場合は、 'Cats'や' Scalaz'を使ってモナド的に行うこともできます。 – sebszyller

+0

醜いと遅い反射なしではありません。タイプ情報は、[ADT](http://typelevel.org/blog/2014/11/10/why_is_adt_pattern_matching_allowed.html)または[HLists](https://github.com/milessabin)でキャプチャする必要があります。 /shapeless/wiki/Feature-overview:-shapeless-2.0.0#polymorphic-function-values) – Reactormonk

答えて

2

ここでは異なるライブラリーなし

を使用することができ、もちろん、あなたがリストのすべての要素にまったく同じ型を持つ必要があるでしょう、あなたはこの関数に入れているとまったく同じタイプを返すことができさえ奇妙ソリューション、次のとおりです。

def test[T](list: List[T]): List[T] = { 
    if(list.isEmpty) return List() 
    list.head match { 
    case a: String => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T]) 
    case a: Int => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T]) 
    } 
} 

test(List("123","123")) // res0: List[String] = List(1233, 1233) 
test(List(1,2,3)) // res1: List[Int] = List(4, 5, 6) 

そして再び編集し、最後ではなく、少なくとも、あなたはこのように、型消去を回避して、リストの種類を確認するためにTypeTagを使用することができます。

def test1[T: TypeTag](list: List[T]): List[T] = typeOf[T] match { 
    case t if t =:= typeOf[String] => list.map(str => (str.asInstanceOf[String]+"3").asInstanceOf[T]) 
    case t if t =:= typeOf[Int] => list.map(int => (int.asInstanceOf[Int]+3).asInstanceOf[T]) 
    case _ => list 
} 

test1(List("123", "123", "123")) // Strings so: res0: List[String] = List(1233, 1233, 1233) 
test1(List("123","123", 1)) // Oh-oh we have not defined type, so: res1: List[Any] = List(123, 123, 1) 
test1(List(1,2,3)) // And here we have res2: List[Int] = List(4, 5, 6) 
+0

ありがとう...それは私の問題を部分的に解決しました –

+1

@ishan問題はありません、私は問題の第2部分を見ていませんあなたの質問が、私はあなたが答えを見つけることを望む:) –

関連する問題