2012-11-30 12 views
2

나는이 두 매개 변수를 취하는 스칼라 방법 : ... 내가 널 대신 긴의 전달해야 할 몇 가지 경우에 따라 그런 일패스는 기대하고 긴

def test(x:Long,y:Int){} 

을 :

test(null,x) 

는 그 결과

scala> test(null,2) :7: error: type mismatch; found : Null(null) required: Long test(null,2)

가 왜 null을 전달해야합니까? 사실, 어떤 이유로 든 기본값을 전달할 수 없습니다. 따라서 이러한 null이 필요합니다.

* 참고 : * 솔루션으로 옵션을 만들 수 있음을 알고 있습니다. 그러나이 메서드 시그니처를 제어 할 권한이 없다고 가정 해 봅시다. 해결 방법은 있습니까?

아이디어가 없습니다.

감사합니다.

+0

또한 사용할 수 java.lang.Long의/더블/정수를 허용하는 메소드를 호출하는 경우 만 작동합니다 문자 그대로의 널 (null)을 통과 java.lang.Long의 – thoredge

+1

스칼라의 'Long'은 사실 JVM 원시 타입'long'에 매핑됩니다. 그래서 원시 타입은'null '이 될 수 없기 때문에 Scala'Long'은'null'이 될 수 없습니다. (스칼라를 혼동하지 마십시오.Long'과'java.lang.Long'!). – Jesper

+0

여기서 문제는 jdbc가 java이고 데이터베이스가 nullable long에 대해 null 값을 저장한다는 것입니다. 스칼라 시스템에서 0L로 전달하면 문제가 있는지 묻습니다. –

답변

2

서명을 변경할 수 없으므로 실수로 Thinking Option[Foo] is the only/most natural way to express a missing function argument을 고려하십시오.

함수에 대한 param이 하한이면 Long.MinValue가 자연스러운 기본값이 될 수 있습니다.

"어떤 이유에서든 기본값을 전달할 수 없습니다"(가능한 무엇이든간에) 서명에 기본값을 추가 할 수 없으며 다른 답안에서 제안 된 경로를 사용하고 있음을 의미합니다 f (a, b)를 g (b, a = Long.MinValue) 또는 포워딩 전의 값으로 변경할 수 있습니다.

어댑터 메소드의 클라이언트를 g (b, None)로 호출하는 대신 g (b)를 호출하게하십시오. 어쨌든 옵션을 기본 f (a, b)로 전달하지 않습니다.

7

Null은 AnyVal에서 상속 한 유형의 하위 유형이며 AnyVal에서 상속 한 값 유형이 아닙니다. 이것이 당신이 null을 전달할 수없는 이유입니다. 이것은 자바에서 long 형의 null을 가질 수없는 방법에 해당합니다. (boxed Long 타입 무시). 때때로 x의 값을 나타내는 것을 간다

def test(x: Option[Long], y: Int) 

:

그러나,이 방법의 특성이 변경되어야한다는 표시이다. 이 좋은 인스턴스를 처리하기위한 좋은 Option 클래스가 있기 때문에, null 값을 사용해야하는 타당한 이유가 없으면 null 값을 확인하는 개발자에게 의존합니다. 대신, Option을 사용하면 컴파일러에서 값이 없을 수도 있다는 사실을 알아야합니다.

+1

나는 그것이 Option.However로해야한다는 데 전적으로 동의한다. 나는 signature signature를 수정할 수 없다. 내가 말하는 것은 논리적이지 않다.하지만 주위에 어떤 일이 있는지 알고 있느냐 !! – Echo

+0

그런 다음 전화를 걸기 전에 명시 적으로 처리해야합니다. –

+0

예 도미니크 .. 어떤 아이디어가 있습니까? – Echo

0

스칼라 프리미티브를 Java 래퍼 클래스로 변환하는 방법은 Java Primitive 래퍼에서 정적 valueOf 멤버를 사용하는 것입니다. 이 문제는 Option [Double]을 java.lang.Double 또는 null로 변환해야 할 때 발생했습니다. 이것은 내가 무슨 짓을 :

val value: Option[Double] 
val orNull = value.map(java.lang.Double.valueOf(_)).orNull 

당신이