2014-09-08 3 views
8

두 개의 다른 클래스에 대해 동일한 암시 적 순서를 정의 할 수있는 방법이 있습니까?Scala Implicit Ordering

다음 줄을 따라 뭔가를 시도했지만 순서를 찾지 못했습니다.

abstract class Common 
case class A extends Common 
case class B extends Common 

implicit val KeyOrdering = new Ordering[Common] { 
    override def compare(x: Common, y: Common): Int = { 
     x.toString.compareTo(y.toString) 
    } 
} 
+1

'extends'은 예약입니다 키워드가 아닌 유형. '공통'을 의미합니까? – Kigyo

+0

그래, 그게 내가 의미하는 바야. 그 점을 지적 해 주셔서 감사합니다. – Olshansk

+0

그래, 왜 이것이 작동하지 않을지 잘 모르겠다. sort (A(), B()). sorted'는 함축적 인 순서는 없지만 명시 적으로'List (A(), B()). sorted (KeyOrdering)'가 작동한다고 말합니다. – Kigyo

답변

22

, 목록의 추론 유형 - 두 개의 요소의 최소 상한이 -.이 보유하지 않기 때문에 Product with Serializable with Common입니다 scala.Ordering으로의 형식 매개 변수에 contravariant되지 않고, 암시 적 해상도가 실패 그 Ordering[Common] <: Ordering[Product with Serializable with Common].

(210)

항상 고려 암시 적 매개 변수의 정확한 유형이있다 그래서 당신은 암시 적 순서를 작성하여이 문제를 해결할 수 있습니다

abstract class Common 
case class A() extends Common 
case class B() extends Common 

object Common { 
    implicit def ordering[A <: Common]: Ordering[A] = new Ordering[A] { 
    override def compare(x: A, y: A): Int = { 
     x.toString.compareTo(y.toString) 
    } 
    } 
} 

또는 간결을위한

가 :

object Common { 
    implicit def ordering[A <: Common]: Ordering[A] = Ordering.by(_.toString) 
} 
+2

다른 답변을 보면 전문가라는 것을 알 수 있습니다. http://stackoverflow.com/questions/19345030/easy-idiomatic-way-to-define-ordering-for-a- 간단한 사례 - 클래스 –

+0

이 특정 문제에 대한 참고로 답변을 업데이트했습니다. . –

2

사례 클래스 A와 B (또는 그 중 하나만 포함)를 제거하면 작동합니다. List(A(), B()).sorted의 경우 OrderingProduct with Serializable with C으로, A 및 B의 기본 클래스는 C의 제품이므로 (A와 B가 모두 대소 문자 클래스이므로) 찾을 수 없습니다.

당신은 두 가지 기본 유형의 요소와 목록을 작성하는 경우

, 난 당신이 당신이 그들을 사용하기 전에 요소를 선언 (또는 유형 C을 반환 일부 기능에서 그들을 얻을 수있는 유형 List[C]의 목록을 원하는 가정합니다.

@ntn에서 언급 한 바와 같이
val a: C = A() 
val b: C = B() 
List(a,b).sorted