2016-09-08 2 views
0

왜 아래의 세 가지 예제 중 하나만 작동하는지 이해가 안 되니? 다른 두 가지는 잘못 되었습니까?scala 클래스 생성자에 implicits

class H(implicit a:String, b: Int) { 
    //Working 
} 

class H(a:String, implicit b: Int) { 
    //Not-Working 
} 

class H(implicit a:String, implicit b: Int) { 
    //Not-Working 
} 

답변

2

에 발 또는 VAR이 필요합니다. 이는 "ab이 생성자를 호출 할 때 암시 적으로 제공 될 수 있음을 의미합니다."(또한 클래스 본문에 함축적으로 사용할 수있게 함) 것을 의미합니다. 이런 의미에서 클래스의 단일 매개 변수 또는 메서드 implicit을 만들 수 없습니다.

implicit의 두 번째 용도는 유형/대상 멤버를 표시하는 것입니다. 생성자 매개 변수는 멤버가 아니지만, pamu의 대답과 마찬가지로 val/var을 사용하여 멤버로 만들 수 있습니다. 또는 보이지 않게하려면 private[this] val.

0
class H1(implicit a:String, b: Int) { 
    //Working 
} 

a 것이 아니라 전체 매개 변수 목록을 참조하지 않는 첫 번째 경우 implicit에서 아래 이가지 경우

class H2(a:String, implicit val b: Int) { 
    //Working 
} 

class H3(implicit a:String, implicit val b: Int) { 
    //Working 
} 
+1

'클래스 H2 (a : 문자열, 암시 적 val b : Int)'는 컴파일되지만 실제로는 내재되지 않습니다. –

+1

@ Łukasz 클래스 내에 암시 적으로 'b'가 선언됩니다. _both_a와 b가 내부적으로나 외부 적으로 내재되어있는 H3에서는 생성자가 new H3 ("(123", 456) "으로 변경됩니다. 어두운 구석, 당신은 거기에 무엇이 숨어 있는지 결코 알지 못합니다. –

관련 문제