2012-05-14 4 views
4

일부 Java 코드에서 scala.collection.immutable.HashMap<A,B>을 사용하며 스칼라 고유 메소드 toArray()을 사용하여 맵의 내용 (또는 값)을 배열로 변환하려고합니다.Java에서 Scala의 HashMap.toArray()를 호출하는 방법은 무엇입니까?

저는 현재 JavaConversions.asMap() 등을 사용하고 있지만 전통적이지만 추악한 Java toArray(T[]) 메서드를 사용합니다. 그러나 대신 스칼라 내장 메서드를 직접 호출하는 것이 좋습니다.

Java에서 수행해야합니다. 스칼라에서 코드를 다시 작성하는 것은 옵션이 아닙니다.

저는 스칼라 2.9.1을 사용하고 있습니다.

답변

2

어레이 유형으로 ClassManifest을 제공해야합니다 (T). 이 객체는 ClassManifest에 대한 컴패니언 객체 (메모 참조)에서 사용할 수 있습니다. 그래서 :

itr.toArray(ClassManifest$.MODULE$.fromClass(T.class)); 

이 예에서, T 실제 유형 (안 유형 매개 변수)입니다. 예를 들어 이 Seq[String] 인 경우이 값을 사용합니다. 스칼라의 Map는 튜플의 무리가 실제로 있기 때문에

itr.toArray(ClassManifest$.MODULE$.fromClass(String.class)); 

, 당신은이를 사용합니다 :

물론
map.toArray(ClassManifest$.MODULE$.fromClass(Tuple2.class)); 

이 오히려 키의 Tuple2<K,V>[]보다 당신에게 Tuple2[]를 제공하고 값 유형 KV입니다. 자바에서 동반자 개체에 액세스하는 : 당신이 자바 땅에, 당신은 원시 형


에게 캐스트 할 수 있습니다.

M이 충분해야 M$.MODULE$

+0

인 것처럼 행동하지 않아야합니다. ClassManifest $ .MODULE $이 ClassManifest.scala에 정의 된 ClassManifest 객체라고 가정합니다. "이 코드는 컴파일러에서 사용하기위한 것이며 클라이언트 코드에서 사용해서는 안됩니다."라는 문법에 대해 걱정합니다. –

+0

"companion object"에 대해서는, 평범한 Java 유형에는 사용할 수없는 것으로 보입니다 (Scala가 생각보다 강력하지 않은 경우). 이 경우 ClassManifest $ .MODULE $ .fromClass (SomeType.class) Scala 유형 (예 : 이미 Tuple2 $ .MODULE $을 가지고있는 Tuple2)에도 사용할 수 있습니까? –

+0

(SomeType []) (... 일부 스칼라 컬렉션) .toArray (ClassManifest $ .MODULE $ .fromClass (SomeType.class))는 잘 작동하는 것 같습니다. 나의 유일한 걱정은 ClassManifest가 클라이언트 코드에 대한 제한을 벗어난다고 주장하는 문서이다. –

0

API 문서를 보면 Manifest (또는 버전에 따라 ArrayTag)의 인수를 toArray으로 입력해야하는 것처럼 보입니다.

+0

을 어디에서 그것을 얻을 수 있습니까? – ziggystar

0

자바에서 스칼라 특정 메서드를 호출하는 것은이 경우에는 때로는 매우 추악 할 수 있습니다. 이에 대한 더 나은 솔루션이 있다면 나도 몰라,하지만이 작동합니다 : 내가 먼저 인스턴스화하지 않고 Class<Tuple2<String,String>>를 얻을 자바 방법을 알고하지 않습니다

import scala.collection.immutable.HashMap; 

import scala.Tuple2; 
import scala.reflect.ClassManifest$; 
import scala.reflect.ClassManifest; 

public class Foo { 
    public static void main(String[] args) { 
    HashMap<String,String> map = new HashMap(); 
    Object ar = map.<Tuple2<String,String>>toArray((ClassManifest<Tuple2<String,String>>)ClassManifest$.MODULE$.fromClass(new Tuple2<String,String>("","").getClass())); 
    System.out.println(ar.toString()); 
    } 
} 

. 스칼라에서 나는 classOf[...] 자바에 상응하는 거기에 사용할 것이라고?

+0

'.class'는'classOf'와 같은 방식으로 클래스를 가져와야합니다. – Submonoid

+0

알지만,'Tuple2 .class'는 작동하지 않습니다. – drexin

+0

좋아요, 더러운 해결책을 발견했습니다 ;-). '(Class >) (Object) Tuple2.class'가 작동합니다. – drexin

1

정적 필드에 액세스하여 사용할 수있는 유형의 동반자 개체 :

map.toArray(scala.reflect.ClassManifest$.MODULE$.Object); 
관련 문제