필자는 1과 2가 동일한 바이트 코드로 컴파일 될 것이라고 생각합니다 (케이스 2에서 생성 된 클래스 이름 제외). Fooable이 암시 적으로 A를 Fooable로 변환 할 수있는 경우에만 (그리고 Fooable을 직접 만들고 사용하지 않으려는 경우) 옵션 2를 사용합니다.
그러나 A 내가 A.
UPDATE에 동작을 추가하는 대신 암시 적 변환의 특성을 이용하여 고려할 것 (A를 의미하는 것은 아닌 서브 클래스 수있는 자바 라이브러리 클래스는 아니다) : 나는 내 대답을 재고해야 . 변형 2가 리플렉션 (리눅스에서 2.8.1 스칼라)을 사용하는 것으로 판명 되었기 때문에, 당신의 코드의 변형 1을 사용할 것입니다. 라는 이름의 클래스
소스 코드를 익명 클래스
와
class NamedClass { def Foo : String = "foo" }
object test {
implicit def StrToFooable(a: String) = new NamedClass
def main(args: Array[String]) { println("bar".Foo) }
}
소스 코드 :
내가 동일한 코드의 두 버전을 컴파일
는, 결과 여기에 JD-GUI와 자바를 디 컴파일하고
object test {
implicit def StrToFooable(a: String) = new { def Foo : String = "foo" }
def main(args: Array[String]) { println("bar".Foo) }
}
java-gui를 사용하여 java로 컴파일 및 디 컴파일. 은 "이름"버전이 자바에 디 컴파일 된 가져옵니다 NamedClass.class 생성
이
public class NamedClass
implements ScalaObject
{
public String Foo()
{
return "foo";
}
}
익명 테스트를 생성을 $$ 곧 다음과 같은 자바 디 컴파일됩니다 $ (1) 클래스
public final class test$$anon$1
{
public String Foo()
{
return "foo";
}
}
그래서 거의 익명의 "final"을 제외하고는 동일합니다. (익명의 클래스를 시도하고 하위 클래스로 만들지 않으려 고합니다.)
그러나 호출 사이트에서 나는 "이라는"버전
public void main(String[] args)
{
Predef..MODULE$.println(StrToFooable("bar").Foo());
}
이 자바를 얻고 익명
public void main(String[] args) {
Object qual1 = StrToFooable("bar"); Object exceptionResult1 = null;
try {
exceptionResult1 = reflMethod$Method1(qual1.getClass()).invoke(qual1, new Object[0]);
Predef..MODULE$.println((String)exceptionResult1);
return;
} catch (InvocationTargetException localInvocationTargetException) {
throw localInvocationTargetException.getCause();
}
}
이는 좀 봤와 others가보고 한 것을 발견 똑같은 일이지만 왜 이것이 사실인지에 대한 더 이상의 통찰력을 찾지 못했습니다.
당신은 당신의 믿음에 대한 증거/증거를 제시 할 수 있습니까? 나는 내가 통제하지 못하는 유형에 추가 할 생각이었습니다. 그렇지 않으면 형질이 물론 더 나은 해결책입니다. 나는 그 점에 관해서 그 질문을 분명히한다. – Raphael
@Raphael 여기에 scala가 설치되어 있지 않으며 증거를 줄 수도 없습니다. 몇 시간 후에 집에 갈 때 두 변종을 모두 컴파일하고 생성 된 .class를 확인한 다음 결과를 게시합니다. –
@Raphael은 귀하가 테스트되지 않은 주장을 신뢰하지 않는 것으로 판명되었습니다. –