2014-12-21 6 views
1

스칼라에서 Webgraph http://webgraph.di.unimi.it/ 프레임 워크를 사용하려고합니다. 여기에 Loader 클래스를 사용자 정의 할 수있는 가능성이 있습니다. 이 사용자 정의는 리플렉션을 통해 이루어졌습니다.스칼라 오버라이드 정적 자바 메서드

... 
graphClass = Class.forName(graphClassName); // graphClassName string name of class 
graph = (ImmutableGraph)graphClass.getMethod("load", classOf[CharSequence]).invoke(null, is); 
... 

java "load"는 클래스의 정적 메서드이지만 내 코드 작업을 허용하기 위해이 메서드를 scala에 작성할 수 있습니까? 내가 시도

class MyLoader { 
    def load(filename:CharSequence) = ... 
} 

또는 graphClassName = "MyLoader의 $"

하지만 성공하지 않고 심지어

object MyLoader { 
    def load(filename:CharSequence) = ... 
} 

.

알려진 해결 방법은 브리지 Java 클래스를 작성하는 것입니다.하지만이를 수행하는 "합법적 인"방법이 있으면 흥미 롭습니다.

//  MyLoader.java 

public class MyLoader { 

    public static ImmutableGraph load(CharSequence basename) throws IOException { 
     return new ScalaMyLoader(basename); 
    } 

} 

답변

1

"MyLoader.class"에 개체를 정의하십시오.

거기에 정적 전달자 메소드가 표시됩니다. 다음

object Foo { def foo = 42 } 

$javap -pv Foo // not Foo$ 
{ 
    public static int foo(); 
    flags: ACC_PUBLIC, ACC_STATIC 
    Code: 
     stack=1, locals=0, args_size=0 
     0: getstatic  #16     // Field stat/Foo$.MODULE$:Lstat/Foo$; 
     3: invokevirtual #18     // Method stat/Foo$.foo:()I 
     6: ireturn  
} 
를 들어

관련 문제