Рассмотрим эти методы из java.lang.String
/**
* Returns the string representation of the <code>Object</code> argument.
*
* @param obj an <code>Object</code>.
* @return if the argument is <code>null</code>, then a string equal to
* <code>"null"</code>; otherwise, the value of
* <code>obj.toString()</code> is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
/**
* Returns the string representation of the <code>char</code> array
* argument. The contents of the character array are copied; subsequent
* modification of the character array does not affect the newly
* created string.
*
* @param data a <code>char</code> array.
* @return a newly allocated string representing the same sequence of
* characters contained in the character array argument.
*/
public static String valueOf(char data[]) {
return new String(data);
}
и этот код Scala
val result = String.valueOf(null)
, что приводит к
String.valueOf(null)
java.lang.NullPointerException
at java.lang.String.<init>(String.java:193)
at java.lang.String.valueOf(String.java:2852)
Работает, если вы аннотируете null
любым другим типом, кроме Array[Char]
.
Почему компилятор Scala предпочитает от Array[Char]
до Object
, учитывая, что Array
по сути является окончательным и не может быть переопределен и инвариантен в своем типе элемента (поэтому вероятность того, что это использование предназначено, весьма маленький)