2013-11-03 12 views

Trả lời

4

Bạn có thể phù hợp với giao diện Number:

def foo(x: Any) = x match { 
    case s: String => println(0) 
    case i: java.lang.Number => println("Numeric") 
} 
+0

Cảm ơn bạn, hoạt động như một sự quyến rũ. – tkroman

+0

Loại kết hợp này không được khuyến khích vì nó là từ đồng nghĩa với kiểu đúc, có thể nhưng được coi là 'kiểu xấu' trong lập trình hàm. – Rajish

+0

Cũng không có cách thành ngữ nào ở đây, vì vậy điều này được khuyến khích cho kịch bản này - cho đến khi Scala bắt kịp với Java .. – matanster

3

Bạn có thể thử này:

def foo[A](x: A)(implicit num: Numeric[A] = null) = Option(num) match { 
    case Some(num) => println("Numeric: " + x.getClass.getName) 
    case None => println(0) 
} 

Sau đó này

foo(1) 
foo(2.0) 
foo(BigDecimal(3)) 
foo('c') 
foo("no") 

sẽ in

Numeric: java.lang.Integer 
Numeric: java.lang.Double 
Numeric: scala.math.BigDecimal 
Numeric: java.lang.Character 
0 

Lưu ý rằng việc thu thập thông số null ẩn sẽ không có nghĩa là không tồn tại tiềm ẩn, nhưng không tìm thấy thông tin nào tại thời gian biên dịch trong phạm vi tìm kiếm cho implicits.

+0

Đó là một điều khó khăn! Thật đáng tiếc tôi không thể chấp nhận cả hai câu trả lời. – tkroman

+0

Có cách nào (tốt đẹp) để tránh giá trị 'null' không? (Ví dụ: cung cấp một ẩn 'Tùy chọn [Số [A]]'?) – r0estir0bbe

+0

Tất cả các thủ thuật mà tôi có thể nghĩ sẽ ít đáng kể hơn và không an toàn hơn đáng kể. –

Các vấn đề liên quan