2013-08-08 24 views
23

Có thể ai đó cho tôi biết làm thế nào tôi có thể tránh được cảnh báo trong khối mã bên dưới:loại hoa văn trừu tượng được đánh dấu kể từ khi nó được loại bỏ bằng cách tẩy xoá

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

Điều này dẫn đến một cảnh báo trình biên dịch:

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

gì 'T <: Bar' nghĩa trên dòng 1? –

+0

Nó chỉ có nghĩa là kiểu tham số t được giới hạn ở trên bởi T. Hoặc nói cách khác T là một kiểu con của Bar hoặc Bar. –

Trả lời

24

Bạn có thể sử dụng ClassTag (hoặc 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 làm gì ở đây? – Blankman

2

biến khác để sử dụng , Đặc biệt là nếu bạn mong muốn sử dụng một trait (như trái ngược với cách sử dụng một class hoặc abstract class mà giải pháp khác đòi hỏi), trông như thế này:

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 
    } 
}