Почему компилятор Scala предпочитает выводить аргумент со значением null как Array [Char] вместо Object? - PullRequest
1 голос
/ 15 января 2011

Рассмотрим эти методы из 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 по сути является окончательным и не может быть переопределен и инвариантен в своем типе элемента (поэтому вероятность того, что это использование предназначено, весьма маленький)

1 Ответ

5 голосов
/ 15 января 2011

Array[Char] предпочтительнее Object, потому что это более конкретно.Если что-то может быть преобразовано в типы X или Y, и есть преобразование из X в Y, то X более специфичен, чем Y ... и X фактически предпочтительнее, чем Y, когда речь идет о перегрузках.

По крайней мере, это предполагает, что Scala похожа на Java с точки зрения разрешения перегрузки, чего я очень ожидаю.

Этого должно быть легко избежать - просто приведите нулевую ссылку к Object, чтобы сделать перегрузку, принимающую Array[Char] неприменимой.

РЕДАКТИРОВАТЬ: Хорошо, посмотрев на спецификацию языка Scala кратко это немного сложнее, чем этоНо я считаю, что основная предпосылка та же.Смотрите p97 в предыдущей ссылке для всех кровавых деталей.

...