2013-01-24 5 views
0

이 문제에 대한 해결책이 너무 분명하거나 이미이 포럼에서 이미 해결 된 경우 용서해주십시오 (이 경우 게시물로 나에게 알려주십시오) .암시 적 개념의 틈새 컬렉션을 만드는 데 사용 된 유형의 순서 지정

I 따라서, 클래스가

org.personal.exercises.LengthContentsPair (l: Int, c: String) 
{ 
    val length = l 
    val contents = c 

} 

그런 다음, 같은 소스 파일에, 나는 또한 방법이 유형의 이 주문하는 객체를 정의하는 암시 적 값을 정의 있습니다

object LengthContentsPair { 

    implicit val lengthContentsPairOrdering = new Ordering [LengthContentsPair] { 

     def compare (a: LengthContentsPair, b: LengthContentsPair)= { 

      a.length compare b.length; 
     } 
    } 
} 

이 포럼에 제공된 솔루션을 따르십시오.

이제 Set의 요소 수를 주어진 숫자로 제한하는 특수 Set을 만들고 싶습니다. 그래서 저는 다음과 같은 별도의 클래스를 정의합니다 :

import scala.collection.immutable.TreeSet; 

import org.personal.exercises.LengthContentsPair.lengthContentsPairOrdering; 

class FixedSizedSortedSet [LengthContentsPair] extends TreeSet [LengthContentsPair] 
{ .. 
} 

제게 이것은 TreeSet을 서브 클래스로 만드는 올바른 방법 인 것처럼 보입니다. 그러나 컴파일러에서 다음 오류가 발생합니다.

(1) No implicit Ordering defined for LengthContentsPair.

(2) not enough arguments for constructor TreeSet: (implicit ordering: Ordering[LengthContentsPair])scala.collection.immutable.TreeSet[LengthContentsPair]. Unspecified value parameter ordering.

범위 지정 규칙을 잘못 이해 했습니까? 그것은 내가 느낀 아주 쉬운 일이지만, 나는 그것에 손을 댄다.

답변

1

FixedSizedSortedSet을 잘못 정의했습니다. 귀하의 구현은 LengthContentsPair이라는 제네릭 타입 매개 변수를 가지고 있습니다.이 매개 변수는 그 이름을 가진 클래스와 아무런 관련이 없습니다. 즉, 클래스를 제네릭 유형으로 음영 처리했습니다. 당신은 단지 LengthContentsPair의 요소를 보유하고 전문 세트가 필요한 경우

는, 그때는 아마 의미 : Ordering[LengthContentsPair]의 인스턴스가 표시되는 경우에 작동합니다

class FixedSizedSortedSet extends TreeSet[LengthContentsPair] 
{ .. 
} 

. 그러나 순서는 동반 객체 LengthContentsPair에 정의되어 있으며 기본적으로 암시 적 매개 변수로 표시되므로 문제가되지 않습니다.

하지만 오히려 그때는 아마이 의미 모든 유형의 요소를 보유 할 수 TreeSet의 일반적인 확장을 필요로하는 경우 :

암시 적 매개 변수는 TreeSet는 암시 Ordering[T] 필요로하기 때문에 필요한, 그래서 우리는 필요됩니다

class FixedSizedSortedSet[T](implicit ordering: Ordering[T]) extends TreeSet[T] 
{ .. 
} 
해당 요구 사항을 FixedSizedSortedSet

BTW로 전달하십시오. 클래스를 case class으로 바꾸는 것이 좋습니다.

+0

어머나! 나는 그림자 효과에 대해 눈이 멀었다는 이유로 나 자신을 싫어한다. 내가 어떻게 그것을 놓칠 수 있고, 코드를 보는 데 적어도 1 시간을 쓸 수 있었다. 발견에 많은 감사드립니다. 그리고, 네, 내 소스 코드에서, LengthContentsPair는 실제로 'case class'입니다. 왜냐하면 내가 할 일이 많기 때문입니다. – Nirmalya