2013-06-25 89 views
0

Java代碼重載方法值的toString替代品

String method1(Object obj) { 
    if (obj == null) { 
    return "null"; 
    } else if (obj instanceof MyClass123[]) { 
    return method2(ob)).toString(); 
    } else if (obj instanceof int[]) { 
    return Arrays.toString((int[]) obj); 
    } else if // and so for double, float, boolean, long, short... 

    } else if (obj instanceof Object[]) { 
    return Arrays.deepToString((Object[]) obj); 
    } else { 
    return obj.toString(); 
    } 
} 

我試圖做同樣的斯卡拉

def method1(obj: Any): String = obj match { 
    case null => "null" 
    case x: Array[MyClass123] => method2(x).toString 
    case x: Array[AnyRef] => Arrays.deepToString(x) 
    case x: Array[_] => Arrays.toString(x) 
    } 

最後一行導致的

overloaded method value toString with alternatives: 
[error] (Array[java.lang.Object])java.lang.String <and> 
[error] (Array[Double])java.lang.String <and> 
[error] (Array[Float])java.lang.String <and> 
[error] (Array[Boolean])java.lang.String <and> 
[error] (Array[Byte])java.lang.String <and> 
[error] (Array[Char])java.lang.String <and> 
[error] (Array[Short])java.lang.String <and> 
[error] (Array[Int])java.lang.String <and> 
[error] (Array[Long])java.lang.String 
[error] cannot be applied to (Array[_]) 
[error]  case x: Array[_] => Arrays.toString(x) 

回答

0

的錯誤,你的錯誤'java.util.Arrays有很多不同的'toString'方法和scala comp iler不知道選哪一個。

但真正的問題是_可以匹配任何類型,包括Any,我們沒有一個版本的toString將與Any工作 - 事實上,我們有最普遍的版本是AnyRefObject,你已經匹配在前一種情況下。雖然toString針對的AnyVal許多亞型定義它不是爲Unit

定義你真的想用什麼方法mkString

def method1(obj: Any): String = obj match { 
    case null => "null" 
    case x: Array[AnyRef] => Arrays.deepToString(x) 
    case x: Array[AnyVal] => x.mkString("[",",","]") 
    case _ => obj.toString 
    } 
+0

這是該Java代碼完全等同?在Java中,分別涉及參考和基元類型的deepToString和toString。 –

+0

與Java代碼不完全遞歸相似,所以我編輯了代碼以反映這一點。 – selig

+0

現在你的代碼中有兩個錯誤:一個 - 它更不準確,第二個 - 它不能編譯。 –

相關問題