2013-08-08 2 views
23

Может кто-нибудь сказать мне, как я могу избежать предупреждения в блоке кода ниже:абстрактный узор типа снят, так как она удаляется стиранием

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

Это приводит к предупреждению компилятора:

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

что делает 'T <: Bar' значит, на линии 1? –

+0

Это просто означает, что тип аргумента t ограничен выше T. Или, другими словами, T является подтипом самого Bar или Bar. –

ответ

24

Вы можете использовать ClassTag (или 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

Что здесь делает classtag? – Blankman

2

Еще один вариант использования , Особенно если вы хотите использовать trait (в отличие от использования class или abstract class, которая требует другого решения), выглядит следующим образом:

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 
    } 
} 
Смежные вопросы