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

  • karneson

    karneson

    23 Temmuz 2006
  • PlugResearch

    PlugResearch

    22 Mart 2006
  • Sams Page :D

    Sams Page :D

    15 Mart 2009