2016-04-11 19 views
3

SomeType[T] türünde bir sürü nesnem var. Bazıları SomeType[String], bazıları SomeType[Int], vb. Gibi. Bunların değişken boyutlu bir setini (ancak potansiyel olarak farklı türlerde) alan bir işlev yazmak istiyorum.Farklı boyutlarda değişken boyutlu girişler

Ben tipleri aşağıdaki gibi bir şey kullanabilirsiniz hepsi aynı olduğunu biliyorsanız:

def someFun[T](inputs: SomeType[T]*): = { 
    // do something here on the list of inputs. 
} 

Herhangi fikirleri nasıl jenerik potansiyel farklı türde girdilerin listesini alır, böylece yapılır? (ör. inputs: SomeType[String] ve inputs: SomeType[Int]) BTW, daha sonra tip bilgilerine ihtiyacım olduğu için SomeType[_] kullanmak istemiyorum.

+1

Bu yöntem ne tür bir sonuç döndürüyor? 'SomeType [_] 'adlı bir wildcard kullanabilirsiniz, ancak tür bilgisi kaybedersiniz .. bu yüzden cevap gerçekten de bu yöntemin gövdesinin ne olduğuna bağlıdır. Esasen aradığınız şey bir K listesidir. –

+0

İyi nokta. Daha sonra tip bilgisine ihtiyacım olduğundan '_' yapamam: -/ – Daniel

+0

Shapeless '[HList]' e bir göz atın (https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0 0,0 # heterojen-listeleri). – Aivean

cevap

1

Sana türü bilgilerini gerekenler emin değilim ama yapmanız gereken tek şey (başka bir işlev vb geçirmeden, diyelim ki, olmadan) doğrudan girişine tepki ise, o zaman şu çalışacak:

case class Box[A](a: A) 

def someFun(boxes: Box[_]*) = 
    boxes.foreach { 
    case Box(a: Int) => println(s"INT: $a") 
    case Box(a: String) => println(s"STRING: $a") 
    case _ => // and so on ... 
    } 

Ve AFAIK, shapeless'in HList'u bunu çözmek için olduğu gibi çözmez, yine de türlerin önceden ayarlanmış olması gerekir.

+0

Çok iyi öneri. Ama mesele şu ki olası türleri bilmiyorum. Ama müşteriden bir şekilde onları geçmesini isteyebilirim. Değişken boyutlu yazı tiplerine de mümkün mü? – Daniel

İlgili konular