2011-09-22 34 views
9

Tôi đang cố gắng sử dụng đối sánh mẫu Scala trên Lớp Java [_] (trong ngữ cảnh sử dụng phản chiếu Java từ Scala) nhưng tôi nhận được một số lỗi không mong muốn. Sau đây mang đến cho "mã unreachable" trên phù hợp với trường hợp jLongKhớp mẫu trên loại [_] loại?

def foo[T](paramType: Class[_]): Unit = { 
    val jInteger = classOf[java.lang.Integer] 
    val jLong = classOf[java.lang.Long] 
    paramType match { 
    case jInteger => println("int") 
    case jLong => println("long") 
    } 
} 

ý tưởng Bất kỳ lý do tại sao điều này xảy ra?

Trả lời

15

Mã này hoạt động như mong đợi nếu bạn thay đổi tên biến thành chữ hoa (hoặc bao quanh chúng với backticks trong mô hình):

scala> def foo[T](paramType: Class[_]): Unit = { 
    | val jInteger = classOf[java.lang.Integer] 
    | val jLong = classOf[java.lang.Long] 
    | paramType match { 
    |  case `jInteger` => println("int") 
    |  case `jLong` => println("long") 
    | } 
    | } 
foo: [T](paramType: Class[_])Unit 

scala> foo(classOf[java.lang.Integer]) 
int 

Trong mã của bạn jInteger trong mô hình đầu tiên là một variable- mới nó không phải là jInteger từ phạm vi xung quanh. Từ specification:

8.1.1 Patterns Biến

... Một mô hình biến x là một định danh đơn giản mà bắt đầu bằng chữ cái chữ thường. Nó khớp với bất kỳ giá trị nào và liên kết tên biến với giá trị đó.

...

8.1.5 Định danh Patterns Ổn

... Để giải quyết sự chồng chéo cú pháp với một mô hình thay đổi, một mô hình định danh ổn định có thể không phải là một tên đơn giản bắt đầu với một chữ thường . Tuy nhiên, có thể kèm theo một tên biến như vậy trong backquotes; sau đó nó được coi là mẫu định danh ổn định.

Xem this question để biết thêm thông tin.

+1

backticks là một giải pháp tốt hơn so với tôi :) – JaimeJorge

+0

Awesome! Rất cám ơn, Travis. – alphageek

7

Trên kết hợp mẫu của bạn, mỗi trường hợp trong số 2 trường hợp này cố gắng tạo tên chủ địa điểm thay vì khớp với loại lớp như mong đợi.

Nếu bạn sử dụng chữ in hoa trong nhân vật bắt đầu, bạn sẽ bị phạt

def foo[T](paramType: Class[_]): Unit = { 
    val JInteger = classOf[Int] 
    val JLong = classOf[Long] 
    paramType match { 
    case JInteger => println("int") 
    case JLong => println("long") 
    } 
} 

scala> foo(1.getClass) 
int 
Các vấn đề liên quan