2010-04-17 32 views
8

Tôi có phương pháp mà tôi vượt qua một đối tượng. Trong phương pháp này, tôi kiểm tra loại của nó và tùy thuộc vào loại tôi làm điều gì đó với nó và trả về một Long. Tôi đã thử tất cả những cách mà tôi có thể nghĩ đến để làm điều này và tôi luôn luôn nhận được một số lỗi trình biên dịch nói với tôi nó hy vọng một đối tượng nhất định nhưng được khác. Ai đó có thể giải thích cho tôi những gì tôi đang làm sai và hướng dẫn tôi đi đúng hướng không? Những gì tôi đã cố gắng cho đến nay là dưới đây:Làm thế nào tôi có thể kiểm tra một đối tượng để xem loại của nó và trả lại một đối tượng đúc

override def getInteger(obj:Object) = { 
    if (obj.isInstanceOf[Object]) null 
    else if (obj.isInstanceOf[Number]) 
     (obj:Number).longValue() 
    else if (obj.isInstanceOf[Boolean]) 
     if (obj:Boolean) 1 else 0 
    else if (obj.isInstanceOf[String]) 
     if ((obj:String).length == 0 | (obj:String) == "null") 
     null 
     else 
      try { 
      Long.parse(obj:String) 
      } catch { 
      case e: Exception => throw new ValueConverterException("value \"" + obj.toString() + "\" of type " + obj.getClass().getName() + " is not convertible to Long")   
      } 
    } 

Trả lời

36

Kết hợp mẫu sẽ làm cho nó đẹp hơn nhiều.

+0

điều này làm việc ra hoàn hảo, với ngoại lệ là trong trường hợp boolean, tôi đã nhận được một lỗi trình biên dịch nói rằng một thời gian dài đã được mong đợi. Tôi đã chăm sóc điều này bằng cách sửa đổi nó thành 'if (b) 1.longValue else 0.longValue' –

+3

Đó là kinda điên không có tiềm ẩn từ int đến lâu. Luôn luôn an toàn để làm điều đó. – davetron5000

+7

@Russ: Hoặc bạn có thể viết 'if (b) 1L else 0L'. – missingfaktor

6

Mã này khóc ra cho việc sử dụng một trận đấu:

obj match { 
    case n: Number => n.longValue 
    case b: Boolean => if (b) 1 else 0 
    case s: String => if ((s eq null) || s.length == 0) null else { 
      // try ... catch ... etc. 
      } 
    case o: Object => null 
} 

Tiếp theo lời khuyên của riêng tôi từ nhận xét của tôi được trả lời ban đầu của tôi ...

+0

Tất nhiên, vấn đề với điều này là với trường hợp Object trước tiên, vấn đề sẽ luôn khớp. Nó sẽ được ở cuối. –

+0

Điều này sẽ không biên dịch như Boolean không phải là phân lớp của đối tượng. – missingfaktor

+1

@Rahul G: Điều đó sẽ không được chẩn đoán trong bản gốc nhưng hiển nhiên trong trường hợp này, một dấu hiệu cho thấy việc sử dụng các tính năng của Scala sẽ giúp bạn xóa các lỗi loại. –

2

Đây có thể là một sự khởi đầu:

def getInteger (o : Any) : Long = o match { 
    case (o: Boolean) => if (o) 1 else 0  
    case (l: Long) => l       
    case (s: String) => java.lang.Long.parseLong (s) 
    case _ => 0L 
} 

(Tôi không có gì để ghi đè và bỏ qua thử/bắt cho ngắn gọn)

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