2016-08-17 2 views
1

저는 초급 언어로 스칼라로 Any 클래스와 혼동합니다. 왜 어떤 유형을 사용할 수스칼라의 모든 클래스

def f(x:Any)=x+5 
<console>:13: error: type mismatch; 
found : Int(5) 
required: String 
     def f(x:Any)=x+5 

x 경우 (: INT 등 문자열 예)

재기록 코드 코드 x 변수가 어떤 데이터 유형이 될 수 있다는 것을 나타내는 전술

def f(x: Any) = println(x) 

은 위의 오류가 발생합니다. 에 대한 이해가 스칼라로 혼동 스럽습니다. 제발 고쳐주세요. mA에 의해 정의 된 경우 정적 타입 언어에서

+1

'x '가 어떤 유형이든간에 항상 5를 추가 할 수 있는지 확신 할 수 없습니다.'f ("hello");를 호출하면 어떻게됩니까? –

+0

@ArnaudDenoyelle 당신의 예제는 이론적으로 좋아,'int'를'String'에 추가 할 수 있습니다. 더 좋은 예는'+'연산자를 오버라이드 (override)하지 않는 클래스입니다. – SamTebbs33

+0

실제로'A <: Any''와'B' 클래스의'b' 인스턴스의 인스턴스 'a'의 경우, 'val c = a + x'형식의 표현식은 실제로'a. + (x)'이것은 클래스 A가'def [B, C] + (b : B) :'메소드를 가지고있을 때만 작동한다는 것을 의미합니다. –

답변

4

당신은 유일한 유형 A의 값 x의 메소드 m를 호출 할 수 있습니다. Any의 성격으로 인해 Any에 전화 할 수있는 유용한 방법이 없습니다 (단, toString 또는 hashCode과 같은 몇 가지 제외). 더하기 연산은 정의되지 않습니다. BooleanBooleanAny의 하위 유형이므로 허용되는 해당 방법으로 Boolean을 전달했다고 가정 해 보겠습니다. 컴파일러에서 코드를 허용 한 경우 Boolean+과 같은 것이 없으므로 문제가 발생합니다. 동적 유형 지정 언어에서 해당 코드를 실행하면 런타임 오류가 발생합니다.


당신이 문자열 일을 연결 할 수있는 암시 적 변환에 +로 인해 문자열을 연결할 수 있기 때문에 오류 메시지가 이상한 같습니다

def f(x: Any) = x + "hello" // implicitly converts x to a string 

f(true) // "truehello" 

이 큰 혼란의 근원이며, hopefully이 언어에서 사라집니다. 당신이 다른 방법을 사용한 경우, 오류가 더 분명있을 것입니다 : 당신이 println() 소스를 보면

def f(x:Any)=x-5 

<console>:54: error: value - is not a member of Any 
     def f(x:Any)=x-5 
        ^
+0

당신은 어원을 언어에서 제거해야한다고 말하고 있습니까? – SamTebbs33

+2

@ SamTebbs33'Predef'의'any2stringadd' 메소드는 매우 성가시기 때문에 제거해야합니다.그것은 오류 메시지의 이상한 표현에 대한 이유입니다. 예제에서'-'를'+'로 바꾸면 차이점을 알 수 있습니다. –

+0

Any에서 String으로의 변환이있는 경우 int 5가 String으로 변환되지 않는 이유는 무엇입니까? Int는 Any의 서브 클래스입니다 – Samar

0

당신이 표시됩니다

public void println(Object x) { 
     String s = String.valueOf(x); 
     synchronized (this) { 
      print(s); 
      newLine(); 
     } 
    } 

String.valueOf

public static String valueOf(Object obj) { 
     return (obj == null) ? "null" : obj.toString(); 
} 

클래스 Any입니다 이미 toString 메서드를 가지고 있지만 + 메서드가 없습니다 (모든 연산자는입니다., - 등이 있습니다 (http://tomjefferys.blogspot.com/2011/11/operator-overloading-in-scala.html 참조).

+0

감사합니다. 개념!! – vivman