2013-10-29 2 views
5

나는 인자가 value class의 인스턴스 일 수도 있고 그렇지 않을 수도있는 메소드를 반사적으로 호출하고 있습니다. 값 클래스의 목적은 기본 값의 복싱을 피하기위한 것이므로 매개 변수 유형이 값 클래스이면 해당 메서드는 사실 unboxed 값을 기대합니다. 이 사건을 처리하기 위해 값 클래스에서 기본 값의 래핑을 시도하고 있습니다. 내가 먼저 인수가 값 클래스의 여부를 결정해야하고, 여기에 내가 첫 번째 걸림돌 명중 :스칼라 : 가치 클래스의 객체 인식

case class NonValueClass(underlying: Int) 
: 예상대로 방법에 대한 true를 반환으로

def isObjectOfValueClass(arg: Any) = 
    classOf[AnyVal].isAssignableFrom(arg.getClass) 

이가 작동하지 않습니다

isObjectOfValueClass을 어떻게 구현할 수 있습니까? 또는 값 클래스의 객체를 인수로 취할 수있는 메소드를 반사적으로 호출하는 더 간단한 방법이 있습니까?

+1

그런데 value 클래스는 프리미티브뿐만 아니라 객체도 래핑 할 수 있습니다. –

답변

3

먼저 isObjectOfValueClass에 가치 클래스 인스턴스의 박스 버전이 제공됩니다.

둘째, 원하는대로 작동하지 않습니다. classOf[AnyVal] == classOf[AnyRef] == <java.lang.Object>이기 때문입니다.

.instanceOf[T], AnyVal는 패턴 매칭 또는 .instanceOf[T]의 매개 변수로 사용할 수 없습니다가없는 박스 값 클래스 및 참조 클래스 (Any 구별 할 실행 방법은 없습니다, 그리고 무엇을 가장 중요한, 컴파일 된 값 클래스는하지 않습니다 확장 또는 구현 AnyVal). 당신이 컴파일시에 결정합니다

, 다음 시도 :

case class IsAnyVal[-T](val value: Boolean) extends AnyVal 
implicit def _noClueHowToNameThisImplicit_1 = IsAnyVal[AnyVal](true) 
implicit def _noClueHowToNameThisImplicit_2 = IsAnyVal[AnyRef](false) 
def isAnyVal[T](arg: T)(implicit ev: IsAnyVal[T]) = ev.value 

scala> isAnyVal(1) 
res4: Boolean = true 

scala> isAnyVal("") 
res5: Boolean = false 

나는 당신이 더 많은 실수 권투없이 검출 박스 값 클래스 인스턴스의 유일한 필드를 추출하는 방법을 모르겠어요. 게다가, 핫스팟은 짧은 수명이 짧은 객체를 최적화하는 데 능숙합니다.