2016-09-23 5 views
3

을 제거 지워 없앰.스칼라 암시 적 방법 인수는 내가 아주 다음 코드를 이해하지 못하는 모호한

그러나 나는 AMarkerSeq[Int]으로 연결하고 BMarkerSeq[String]으로 연결하는 "마법"이 무엇인지 이해하지 못합니다.

더 구체적으로 말하면 m(Seq("a", "b"))을 호출하면 컴파일러에서 암시 적 BMarker을 사용해야하며 두 번째 전화는 m일까요? Seq은 이미 유형이 지워지지 않았습니까?

+3

올바른 방법을 호출하기 위해 컴파일시 Seq [A]의 유형 정보를 사용할 수 있지만 런타임에는 해당 정보를 사용할 수 없기 때문에 – Falmarri

+2

질문에 대한 대답이 아니라 재미있는 관찰 : 모호성 제거 가능 하나의'm()'을 하나의 함수로 만들고 다른 하나는 하나의 메소드로 남겨 두는 것입니다. 암시 또는 마커가 필요하지 않습니다. – jwvh

답변

0

직접 질문에 답변하려면 아니오, 유형 삭제가 아직 발생하지 않았습니다. 암시 적 검색은 유형에 대한 완전한 지식을 가지고 발생해야합니다. 이러한 방법은 런타임에 어떻게 보이는지 확인하려면, 당신은 컴파일 된 클래스를 볼 수 javap을 실행할 수 있습니다

scala> :javap M -s 
Compiled from "<console>" 
public class M$ { 
    public static final M$ MODULE$; 
    Signature: LM$; 
    public static {}; 
    Signature:()V 

    public void m(scala.collection.Seq<java.lang.Object>, M$AMarker$); 
    Signature: (Lscala/collection/Seq;LM$AMarker$;)V 

    public void m(scala.collection.Seq<java.lang.String>, M$BMarker$); 
    Signature: (Lscala/collection/Seq;LM$BMarker$;)V 

    public M$(); 
    Signature:()V 
} 

그래서 기본적으로 컴파일러했다 명확한 실행 방법. 그것은 컴파일 타임 동안 정확한 방법을 찾으며 근본적으로 암시 적 객체를 사용하여 모호하지 않게합니다.

쿨 트릭 BTW! 전에 직접이 방법을 사용한 것을 보지 못했습니다.