![](/img/trans.png)
[英]How to pass complex Java Class Object as parameter to Scala UDF in Spark?
[英]How to pass a class object from Scala to Java?
我正在嘗試使用Scala代碼中的Java類庫。 (准確地說是JGraphT。)我需要調用的一個構造函數是
public class SimpleGraph<V, E>
extends AbstractBaseGraph<V, E>
implements UndirectedGraph<V, E>
{
public SimpleGraph(Class<? extends E> edgeClass) {...}
}
要從Java中調用它,我會說:
UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
什么是正確的Scala等價物?
更具體地說,如何將DefaultEdge.class參數傳遞給構造函數?
正如你所說,等效的Scala代碼
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
但是,由於Scala可以推斷出構造函數的類型參數,因此可能會因此而減少干擾
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge])
但這並不像它能得到的那么干。 “DefaultEdge”類型被提到兩次。 您可以通過清單獲得更多干燥。 首先,您創建一個用於創建SimpleGraphs的工廠。
object SimpleGraph {
import scala.reflect.Manifest
def apply[T, E]()(implicit mfst : Manifest[E]) = new SimpleGraph[T,E](mfst.erasure.asInstanceOf[Class[_ <: E]])
}
有了這個,我們可以創建一個圖表
val g = SimpleGraph[String, DefaultEdge]()
要么
val g: UndirectedGraph[String, DefaultEdge] = SimpleGraph()
顯然,如果你創建了一堆SimpleGraphs,這種技術是值得的
現在一些警告和警告。 清單仍然被認為是實驗性的。 我懷疑它們太有用了,不會被丟棄,但是沒有保證。 有關清單的更多信息,請參閱http://scala-blogs.org/2008/10/manifests-reified-types.html
我找到了自己的答案。 相當於
val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.