2011-01-15 1 views
1

java.lang.StringScala 컴파일러가 Object 대신 Array [Char]로 값 null의 인수를 유추하는 것을 선호하는 이유는 무엇입니까?

/** 
* 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); 
} 

에서 이러한 방법을 고려하고

String.valueOf(null) 
java.lang.NullPointerException 
    at java.lang.String.<init>(String.java:193) 
    at java.lang.String.valueOf(String.java:2852) 

당신이 Array[Char] 이외의 다른 유형 null 주석을 경우 작동 결과이 스칼라 코드

val result = String.valueOf(null) 

.

왜 스칼라 컴파일러는 Array 효과적으로 최종 재정의 할 수없고, (그래서이 사용 의도가있는 가능성은 매우 작다)의 요소 형 불변임을 고려 Object-Array[Char]을 선호하는 것입니까?

답변

5

Array[Char]은보다 구체적이기 때문에 Object보다 선호됩니다. 무언가가 X 또는 Y 유형으로 변환 될 수 있고 X 에서 Y로 변환되는 경우 X는 Y보다 구체적입니다. 그리고 과부하 일 때 X가 Y보다 효과적으로 선호됩니다.

적어도 스칼라는 과부하 해결 측면에서 자바와 같다고 생각합니다.

null 참조를 Object으로 캐스트하면 과부하가 적용될 수 없으므로 Array[Char]은 적용 할 수 없습니다.

편집 : 좋아, Scala language specification간단히보다 복잡하지만, 기본 전제가 동일하다고 생각합니다. 모든 피투성이 세부 정보는 이전 링크의 p97을 참조하십시오.

+0

"하위 유형입니다"로 "변환 될 수 있음"을 의미하고 범위에서 암시 적 변환을 사용하는 것으로 간주하지 않습니까? 'null'은 어떤 참조 형의 서브 타입 인'Null' 타입의 값이고'Array [Char]'는'Object'의 서브 클래스이므로 그냥 배열이 잘 맞는지를 결정할뿐입니다. ... 그때 진짜 문제는 여기서 이름을 짓는 것입니다. 'valueOf (char [])'는 실제로 다른 이름을 가져야합니다. 다른 이름을 사용해야하기 때문입니다. C#은 이전에 자바가 가지고 있던 모든 것을 기본적으로 복사했던 것과 같은 문제를 가지고 있습니까 (그리고 JDK 1.0 이후로'java.lang.String'이 존재합니까?)? – soc

+0

@soc : Java와 .NET에는 상당히 다른 String 클래스가 있습니다. 사실, .NET과 Java 간에는 다른 라이브러리가 많이 있으며 1.0 이후 왔습니다. 물론 언어에는 많은 유사점이 있지만 간단하게 작성하는 것은 쉽지 않습니다. –

+0

"로"변환 할 수 있습니다 "내 말은"스칼라 용어로 보입니다. 사양에서 : "null 값은 scala.Null 유형이므로 모든 참조 유형과 호환됩니다." –