2013-08-08 9 views
23

Qualcuno potrebbe dirmi come posso evitare l'avviso nel blocco di codice qui sotto:astratto tipo di pattern non è selezionata in quanto viene eliminata per la cancellazione

abstract class Foo[T <: Bar]{ 
    case class CaseClass[T <: Bar](t: T) 
    def method1 = { 
    case CaseClass(t: T) => println(t) 
    csse _ => 
    } 
} 

Questo si traduce in un avviso del compilatore:

abstract type pattern T is unchecked since it is eliminated by erasure 
case CaseClass(t: T) => println(t) 
       ^
+0

cosa vuol 'T <: significa bar' sulla linea 1? –

+0

Significa semplicemente che il tipo di argomento t è delimitato superiormente da T. O in altre parole T è un sottotipo di Barra o Barra stessa. –

risposta

24

Si potrebbe utilizzare ClassTag (o TypeTag):

import scala.reflect.ClassTag 

abstract class Foo[T <: Bar : ClassTag]{ 
    ... 
    val clazz = implicitly[ClassTag[T]].runtimeClass 
    def method1 = { 
    case CaseClass(t) if clazz.isInstance(t) => println(t) // you could use `t.asInstanceOf[T]` 
    case _ => 
    } 
} 
+2

Cosa fa classtag qui? – Blankman

2

Un'altra variazione da usare , Soprattutto se si desidera utilizzare un trait (anziché utilizzare un class o abstract class cui l'altra soluzione richiede), assomiglia a questo:

import scala.reflect.{ClassTag, classTag} 

trait Foo[B <: Bar] { 
    implicit val classTagB: ClassTag[B] = classTag[B] 
    ... 
    def operate(barDescendant: B) = 
    barDescendant match { 
     case b: Bar if classTagB.runtimeClass.isInstance(b) => 
     ... //do something with value b which will be of type B 
    } 
} 
Problemi correlati