2014-05-18 4 views
0

나는 coursera에서 가르친 Martin Odersky의 스칼라 코스를 따라 가고있었습니다. 그는 반환 형식에 대한 몇 가지 훌륭한 예제를 제공하고 한 가지 나를 의아해 : 언제 scala가 Any를 반환할까요?

if(true) Tweet.comment("hello") else String("Hello") // I assume that this code will return AnyRef 

그러나 의지 스칼라는 과거의 어떤을 반환 할 때

if(true) 1 else false // return AnyVal as this is the closest subtype of both primitive types 

내가이 다음과 같은 가정? 그것은 언제나 돌아올 것인가?

+2

'if (cond) 1 else "hello"' 'Any' -'AnyVal'과'AnyRef'의 두 가지 하위 타입이 있습니다. 그래서 두 개의 브랜치가 각각의 서브 타입을 리턴하면, 전체 표현식의 타입은'Any'가 될 것입니다. – Lee

+0

@Lee이 대답은 – Ryan

답변

1

내가 스칼라 알고 있지만 예를 기반으로하지 않습니다는

if(true) 1 else "hello" 

트릭을 아마해야한다.

+7

입니다. IMHO, 컴파일되지 않은 답변은 녹색 확인을 받아서는 안됩니다. –

7

@ dfeuer 님의 답변이 정확합니다. 추가 정보를 입력하고 싶습니다.

AnyVal

프리미티브 타입 기본 유형, 즉 Int 등 자바 Boolean, Byte, 이것들은 "키워드" int 유형, boolean, byte이다.

AnyRef은 참조 유형의 기본 유형입니다 (예 : java.lang.Object). 바로 약 class입니다.

AnyAnyValAnyRef 사이의 일반적인 유형입니다. 귀하의 예에서는 1 else false을 반환하므로 컴파일러는 IntBoolean 사이의 공통 유형을 찾고 AnyVal을 찾습니다. 당신이 if(true) 1 else "hello"를 반환하는 경우

, 그것은 일반적인 Int 사이의 유형 (AN AnyVal)과 String (AN AnyRef)를 발견, 그래서 Any를 찾습니다.

+0

'AnyRef가 아닌 Any 클래스에는 모든 클래스가 포함됩니다. ' '클래스 X (val x : Int)가 AnyVal을 확장하면'(true) new X (42) else 42'가 'AnyVal' 타입을가집니다. –

+0

'AnyVal' 클래스는 어떤 기능을합니까?'AnyRef' (일반 컨테이너 등)로 할 수있는 일이 많지만 raw/unboxed 값은 매우 비 균일합니다. 'AnyVal'은 단지 클래스를 값 클래스로 선언 할 수 있고 컴파일러가 실제로 당신에게 그것을 확인하도록 할 수 있습니까? – dfeuer

+0

실제 권한으로는 대답 할 수 없지만 [이 질문] (http://stackoverflow.com/questions/12655028/what-is-the-purpose-of-anyval)과 관련된 것 같습니다. – Dylan

4

방법에 대해 : 즉

scala> if (true) "hi" 
res0: Any = hi 

the spec says 때문에 다른 절이있는 단위 값을 공급하고 있음을 AnyVal :

SO 얼마 전에에 와서
scala> if (true) "hi" else() 
res1: Any = hi 

, 그러나 나는 그것을 사냥하는 동기가 아니다. 교훈은, 혼자서 if이 Unit 유형이라고 기대할 수 있다는 것입니다.

난 그냥 형식의 재귀 함수에 대한 컴파일러 오류가 있었다 :

def f = if (cond) f 

당신은 f의 결과 유형을 지정해야합니다.

관련 문제