2010-12-02 2 views
3

일부 매개 변수화 된 클래스 C [T]를 만들고 클래스 T의 매개 변수가 될 수 있도록 T 유형의 특성에 대한 몇 가지 요구 사항을 만들고 싶습니다. T가 특성이나 클래스에서 상속 받았다고 (주문과 마찬가지로) 말하고 싶으면 간단 할 것입니다. 그러나 나는 그것도 몇 가지 기능을 구현 싶어요.스칼라 : 일반 클래스의 형식 매개 변수에 대한 요구 사항을 만드는 방법?

예를 들어 많은 미리 정의 된 유형이 MinValue 및 MaxValue를 구현한다는 것을 보았습니다. 이러한 유형을 구현하기 위해 T 유형을 사용하고 싶습니다. 암시 적 함수를 정의하기위한 조언을 받았습니다. 그러나 이미 구현 된 경우 모든 사용자가이 기능을 구현해야한다는 점을 싫어합니다. 나는 그것들을 내 코드에서도 구현할 수 있지만, 단지 빈약 한 빠른 수정 인 것처럼 보인다.

예를 들어 힙을 정의 할 때 사용자가 빈 힙을 생성 할 수있게하고 싶습니다. 이러한 경우 나는 유형 T가 가질 수있는 최소값으로 가치를 정하고 싶습니다. 분명히이 코드는 작동하지 않습니다.

class Heap[T](val value:T,val heaps:List[Heap[T]]){ 
    def this()=this(T.MinValue,List()) 
} 

또한 온라인 스칼라 2.8 참조에 대한 조언도 받고 싶습니다.

+0

: 유형 클래스에

롤 ...

class HasMinMax[T] { def maxValue: T def minValue: T } implicit object IntHasMinMax extends HasMinMax[Int] { def maxValue = Int.MaxValue def minValue = Int.MinValue } implicit object DoubleHasMinMax extends HasMinMax[Double] { def maxValue = Double.MaxValue def minValue = Double.MinValue } // etc class C[T : HasMinMax](param : T) { val bounds = implicitly[HasMinMax[T]] // now use bounds.minValue or bounds.minValue as required } 

UPDATE는

[T : HasMinMax] 표기는 바운드 상황이며, 대한 문법 설탕입니다 (의사) 코드 예제로 당신이 무엇을했는지 명확히 해주십시오. 무엇을 시도 했습니까? 왜 작동하지 않았습니까? –

+0

Scala 리소스에 대한 많은 링크는 http://stackoverflow.com/questions/68074/good-way-to-learn-scala를 참조하십시오. –

+0

유형 경계에 대해 읽어보십시오. 코드 예는 다음과 같습니다. https://gist.github.com/257758/47f06f2f3ca47702b3a86c76a5479d096cb8c7ec –

답변

5

몇 가지 방법을 공유했기 때문에 모든 것이 느슨하게 관련되어 있습니다 (다른 반환 유형을 사용하더라도). 나에게 ad-hoc 다형성과 같은 확실한 소리! 당신이 할 수

class C[T](param : T)(implicit bounds: HasMinMax[T]) { 
    // now use bounds.minValue or bounds.minValue as required 
} 
+0

정상적인 기능에는 정상적으로 작동합니다. 하지만 생성자 안에서 사용하는 데 문제가 있습니다 ... 경계가 발견되지 않았다는 것을 의미합니다. – Bruna

+0

확장을 내 정의에 추가 했으므로 효과가 있습니다. –

2

당신은 형의 경계를 사용할 수 있습니다 :

C을 가능하게
trait Base 

class C[T <: Base] 

Base의 하위 유형입니다 모든 종류의 T으로 매개 변수화 할 수 있습니다.

또는 당신은 요구 사항을 표현하는 암시 적 매개 변수를 사용할 수 있습니다 : 당신이 그들을 변수화 할 T 유형에 대한 Requirement 특성의 구현이 존재하는 경우

따라서
trait Requirement[T] { 
    def requiredFunctionExample(t: T): T 
} 

class C[T](implicit req: Requirement[T]) 

, 클래스 C의 객체 만 구축 할 수 있습니다 . 예를 들어 패키지 객체에 T 유형에 대해 Requirement의 구현을 배치하여 해당 패키지를 가져올 때마다 범위로 가져올 수 있습니다.

+0

Ok! 하지만 그건 제가 찾고있는 것이 아닙니다. MinValue와 MaxValue가 이미 정의되어있을 때 특성에서 재정의하고 싶지 않습니다. 그것보다 더, 나는 Int, Double, Char ...를이 매개 변수 T가되고 싶습니다. 그러나 그것들 중 어느 것도 내가 만드는 특징을 확장하지 못합니다. – Bruna

+0

문제는'MinValue'와'MaxValue'는'Int','Char', ...에 대해 같은 타입을 가지고 있지 않습니다.그들은 서로 다른 서명을 가지고 있으므로 서로 다른 방법입니다. 즉, 아마 Any와 같은 추상 메서드를 반환하여 요구 사항 특성을 만들고 기본 형식에 맞게 다시 정의해야 할 것입니다. 나는 당신을 정확하게 이해하기를 바랍니다. – axel22

관련 문제