2014-12-10 2 views
3

좋아, 내가 디자인 선택 사항으로 nulls를 사용하는 것보다 잘 알고 있지만,이 경우에는해야합니다. 왜 다음 컴파일되지 않습니다? 문제가 해결되지 않는 이유를 모르겠어요형식 매개 변수의 인스턴스로 null

def test[T<:AnyRef](o :Option[T]) :T = o getOrElse null 

Error:(19, 53) type mismatch; 
       found : Null(null) 
       required: T 
       Note: implicit method foreignKeyType is not applicable here because it comes after the application point and it lacks an explicit result type 
def test[T<:AnyRef](o :Option[T]) :T = o getOrElse null 
               ^
+0

가 왜'Option.orNull'를 사용하지 않는 당신이 하한 추가하면

코드는 작동? –

+0

이것이 제가 선택한 첫 번째 선택 이었지만 작동하지 않을 때 (이유는 아래 답변에 나와 있습니다) 나는 예제를 더 간단하게 만들려고 노력했습니다. – Turin

답변

8

Null은 모든 참조 유형의 하위 유형이지만 T가 AnyRef의 부속 유형이라는 사실은 T가 참조 유형임을 보장하지 않습니다. 특히 Nothing은 Null을 포함하지 않는 AnyRef의 부속 유형입니다.

def test[T >:Null <:AnyRef](o :Option[T]) :T = o getOrElse null; 

의미가 있습니다 :

scala> def test[T >:Null <:AnyRef](o :Option[T]) :T = o getOrElse null; 
test: [T >: Null <: AnyRef](o: Option[T])T 

scala> 

scala> 

scala> test(None) 
res0: Null = null 

scala> test(Some(Some)) 
res1: Some.type = Some 
+0

'Nothing <: Null'때문에 하한이 필요합니다. 그렇지 않으면,'test [Nothing] (None)'을 사용하여'Nothing' 인스턴스를 생성 할 수 있습니다. –

+0

네 말이 맞아. 내가 바로 잡을거야. – jsalvata

+0

아, 이제 모든 것이 명확합니다. 감사! – Turin

2

-Null 스칼라의 모든 참조 유형의 하위 유형입니다, 그래서 당신이 어떤 T <: AnyRef 작업 것으로 기대.

def test[T <: AnyRef](o: Option[T]): T = o getOrElse null.asInstanceOf[T] 

(- 합법적 인 사용 사례가 줄 내가 당신을 상상할 수있는, 예를 들어 자바 코드에 데이터를 전달해야 할 때 가능한 스칼라에서 null를 사용하지 않도록하십시오) : 당신은 asInstanceOf 작업을 할 수 있습니다 . 그런데

, OptionNone 경우 그것은 Somenull 경우 옵션의 값을 반환하는 방법 orNull 갖는다.

+1

매개 변수 없음으로 호출하면 NPE가됩니다. – jsalvata

+0

REPL에서는 REPL의 부작용이있을 수 있습니다. REPL에서 이것을 시도해보십시오 :'test (None : Option [String]) ' – Jesper

+0

맞아. 여전히, <: AnyRef 대신에> : Null을 사용하는 솔루션 (모든 참조 유형이이 두 가지 사이에 있기 때문에 동등합니다)은 .asInstanceOf를 사용하는 것보다 깔끔합니다. – jsalvata

관련 문제