SORU
7 Temmuz 2009, Salı


Nasıl Scala türü silme kurtulmak mı? Ya da, neden bu tür ödemelerin parametre olsun t'?

Bu çok acı bir gerçek hayat Scala eğer örneğini Listesi[İnt], sen-ebilmek doğrulamak bu örnek bir Liste, ve sen-ebilmek doğrulamak herhangi bir elemanı bir İnt, ama bu kadar değil Listesi[İnt], kolayca doğrulandı:

scala> List(1,2,3) match {
     | case l : List[String] => println("A list of strings?!")
     | case _ => println("Ok")
     | }
warning: there were unchecked warnings; re-run with -unchecked for details
A list of strings?!

-İşaretli seçeneği dürüstçe suçu tip silme koyar:

scala>  List(1,2,3) match {
     |  case l : List[String] => println("A list of strings?!")
     |  case _ => println("Ok")
     |  }
<console>:6: warning: non variable type-argument String in type pattern is unchecked since it is eliminated by erasure
        case l : List[String] => println("A list of strings?!")
                 ^
A list of strings?!

Neden ve nasıl bir çözüm bulabilirim?

CEVAP
7 Temmuz 2009, Salı


Bu cevap Scala 2.10 olarak önerilmiyor Manifest-API, kullanır. Cevaplar daha geçerli çözümler için lütfen aşağıya bakınız.

Scala, Java Sanal Makinesi (JVM), Java aksine, jenerik alamadım çünkü Yazın Silme ile kabul edildi. Bu, çalışma zamanında, sadece bir sınıf var, yazın parametreleri anlamına gelir. Bu örnekte, JVM bu liste Int parametreli* *6, ama bir kullanım olduğunu bilir.

Neyse ki, o etrafında almak sağlar Scala bir özelliği var.Apaçık. Bir Bildirim nesneleri temsil eden türleri olan bir sınıf. Bu örnekleri nesneleri olduklarından, onları geçmek, onları saklamak, ve genellikle onları yöntemleri çağırabilirsiniz. Kapalı parametreleri desteği ile çok güçlü bir araç olur. Örneğin: aşağıdaki örnek al

object Registry {
  import scala.reflect.Manifest

  private var map= Map.empty[Any,(Manifest[_], Any)] 

  def register[T](name: Any, item: T)(implicit m: Manifest[T]) {
    map = map.updated(name, m -> item)
  }

  def get[T](key:Any)(implicit m : Manifest[T]): Option[T] = {
    map get key flatMap {
      case (om, s) => if (om <:< m) Some(s.asInstanceOf[T]) else None
    }     
  }
}

scala> Registry.register("a", List(1,2,3))

scala> Registry.get[List[Int]]("a")
res6: Option[List[Int]] = Some(List(1, 2, 3))

scala> Registry.get[List[String]]("a")
res7: Option[List[String]] = None

Bir öğe saklarken, bir "Bildirim" de. saklıyoruz Bir Bildirim Scala türleri temsil eden bir sınıftır. Bu nesneler bize tam parametreli türü için test etmek için izin JVM daha fazla bilgi var.

Manifest hala gelişmekte olan bir özellik olduğunu unutmayın. Kısıtlamalarına bir örnek olarak, şu anda varyans hakkında hiçbir şey bilmiyor ve her şeyi eş-değişken olduğunu varsayar. Scala yansıma kütüphane, halen geliştirme aşamasında, biter bitmez bir kez daha istikrarlı ve sağlam olacak sanırım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • campos9896

    campos9896

    24 Mart 2012
  • Candyrat Records

    Candyrat Rec

    10 Mayıs 2006
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007