2011-08-04 3 views
8

, 나는 조금 투박스칼라에서 implicits를 사용하여 toString을 자동으로 대체 할 수 있습니까? 자바에서

class MyDate extends java.util.Date { 
    public String toString() { ... } 
} 

MyDate date = new MyDate 

같은 것을 할 것입니다. 스칼라에서는 MyDate 대신 일반 java.util.Date를 사용하면서 toString을 재정의 할 수 있습니까? 나는 암시 적 implicits가 관련되어 있지만 어떤 기술을 사용하여 행복 할 것입니다

+0

정확한 'toString'을 사용하지 않는 코드를 원한다면 java.util.Date를 확장해야한다; 그 객체의 메소드 테이블에 다른 포인터를 갖는 것이 다른 문자열을 생성하는 유일한 방법입니다! –

답변

17

암묵적 변환은 변환되는 유형이 주어진 서명이있는 메소드를 가지고 있지 않을 경우에만 작동 할 수 있습니다. 모든 것이 toString이므로 포주로이를 무시할 수는 없습니다.

trait Show[-A] { 
    def show(a : A): String 
} 

그럼 대신 toString의 모든 곳에서 show을 사용할 수 있습니다 : 당신이 할 수있는 무엇

은 다음과 같습니다 (scalaz.Show에 가깝다)를 typeclass를 사용합니다. 이상적으로 당신이 원하는 것은 Show[Any] 인스턴스를 암시 적으로 매우 낮은 우선 순위로 만드는 것입니다.

implicit val DateShow = new Show[Date] { def show(d : Date) = "whatever" } 

trait LowPriorityShows { 
    implicit val AnyShow = new Show[Any] { def show(a : Any) = a.toString } 
} 

P. scalaz.Show을 사용하지 않는 이유는 반환 유형이 List[Char]인데 대부분의 사용에는 실용적이지 않습니다.

+1

implicits의 우선 순위 제어에 대한 설명은 Daniel Sobral의 글을 참고하십시오 : http://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits –

관련 문제