2

当使用 py4j 触发 jvm 时,有没有办法像 scala/java 那样进行类型转换?

基本上,我想翻译这个:

someOtherTypeInstance.asInstanceOf[RDD[Any]]

变成这样的东西:

someOtherTypeInstance = gateway.jvm.getSomeOtherTypeInstance()
someOtherTypeInstance.asInstanceOf(gateway.jvm.RDD[Any]) // don't know how to deal with generics
4

1 回答 1

2

Py4J 通常不需要类型转换,因为它大量使用反射。

如果您在对象上调用方法,Py4J 将使用 JVM 反射工具在对象的类层次结构中找到此方法,无论对象的广告类型是什么。同样,当您将对象传递给方法时,Py4J 将尝试通过检查类层次结构和对象的实现接口来找到最接近的方法签名。

例如,这段代码在 Py4J 中完全有效:

// Java code
public class TestTypes {
    public void method1(Foo param1) {}

    public Object getObject() { new Foo() }
}

// Python code
myJavaObject = java_gateway.jvm.TestTypes()
obj = myJavaObject.getObject()
// no need for type casting
myJavaObject.method1(obj)

如果您需要针对其他场景进行类型转换(我对 Scala 了解不多),您应该填写一个feature request

于 2014-11-27T09:49:59.767 回答