2016-11-06 5 views
1

잠시 동안 Java로 작업 한 후에 스칼라를 처음 접했기 때문에 기본 질문 인 경우 사과드립니다. 나는 float 또는 double precision으로 실행되기를 원하는 메소드를 가지고 있으며 스칼라의 다형성을 사용하는 것이 매우 쉬울 것 같았다. 자바에서는 메소드를 오버로드하여 부동 인수를 취하고 다른 인수는 이중 인수를 취하는 것이 유일한 방법 이었지만 다형성을 사용하면이를 피할 수 있고 작동 할 수있는 한 가지 방법이있을 것이라고 기대하고 있습니다. 어느 쪽이든.다형성 메소드의 스칼라 타입 변환

def Sample[A: Numeric](x: A, y: A)(implicit num: Numeric[A]): A= { 
    import num._ 
    var out = 2.0.asInstanceOf[A] * x * y 
    return out 
} 

이 배정 밀도에 대한 잘 작동하지만 ClassCastException이 결과는 내가 실행하려고하면 : 나는 지금까지 구현 한 방법은 (일반 작업이 인수 사이에 작동하게하는 방법에 대한 https://stackoverflow.com/a/4033390/6247850) 다음과 같습니다 플로트에. 이 문제를 해결할 수있는 방법이 있다고 생각하게하는 2.0.toFloat.asInstanceOf[A]으로 변경하여 해결 방법을 하드 코드 할 수 있습니다. 그러나 하드 코드를 사용하면 일반적인 방법으로 만들지 못할 것입니다. 나는 또한이 대답 https://stackoverflow.com/a/34977463/6247850을 사용함으로써 부서가 적절하게 작동하도록하는 일의 불균형 한 양과 같이 보였던 일을해야만했고, 일을하기보다는 덜 비교하기 위해 건물을 짓았다.

필자가 원했던 것은 메서드가 실행되고 반환되어야하는 정밀도를 지정하는 기능입니다. 이 문제는 .asInstanceOf[A]이 이미 올바른 유형이 아닌 이상 작동하지 않기 때문에 해당 메서드에 사용 된 다른 변수를 적절한 유형으로 캐스팅 할 때 발생합니다.

def Sample[A: Numeric](x: A, y: A)(implicit num: Numeric[A]): A = { 
    num.times(
    num.fromInt(2), 
    num.times(x, y) 
) 
} 

이 과부하 연산기 어떤 모호성을 해결할 수 있도록 제 :

답변

3

여기에서 명시 Numeric 방법을 이용하여 간단한 해결책이다. 실제 키는 여기에 fromInt 방법의 사용, 그래서 우리가 쓸 수 그것을 다시 사업자와 (당신의 코드에서와 같이) 짧은 : 당신은 (이 특정 예에서) 여기에 어떤 캐스팅이 필요하지 않습니다

def Sample[A: Numeric](x: A, y: A)(implicit num: Numeric[A]): A = { 
    import num._ 
    fromInt(2) * x * y 
} 

. 단지 대신 2의 어떤 수를 가지고 있고, 나는 생각한다, 당신이 그것을 해결할 수없는 당신이 사전에되고 싶은 입력하는 모를 때보다 일반적인 상황에 대해서

scala> Sample(2.5D, 0.01D) 
res12: Double = 0.05 

scala> Sample(2.5F, 0.01F) 
res13: Float = 0.049999997 

: 여기에 사용 데모입니다 하나의 다형 함수. typeclass를 정의하고 작업 할 특정 유형에 대해 암시 적 인스턴스를 제공 할 수 있습니다 (ad-hoc polymorphism).

+0

와우, 빠른 응답에 감사드립니다! 한 번에 많은 작업을 사용할 때 더 간결하게 만들 수있는 방법이 있습니까? '2 * x * (1)에 비해'num.times (num.fromInt (2), num.times (x, num.plus (num.fromInt (1), y)))'와 같은 코드는 읽기가 어렵습니다. + y)' – user6247850

+0

@ user6247850 실제로 네, 원래 코드 그대로입니다. 나는이 대안을 추가 할 것이다. 일반적인 경우에 대한 내 업데이 트를 참조하십시오. – laughedelic