【问题标题】:JRuby equivalent for casting null to class将 null 转换为类的 JRuby 等效项
【发布时间】:2016-07-14 02:47:21
【问题描述】:

我尝试通过 JRuby 使用 Java weka 机器学习库。到目前为止它运行良好,我只想知道一件事:

为了创建 string 属性,您可以使用与 Java 中的 nominal 属性相同的构造器,但第二个参数是转换为 FastVector 的 null:

Attribute attribute = new Attribute("name", (FastVector) null);

另请参阅 this Stackoverflow postweka doc for Attribute

在 JRuby 中,如果您尝试仅传递 nil,例如:

java_import 'weka.core.Attribute'
attribute = Attribute.new('name', nil)

它会引发Java::JavaLang::NullPointerException 错误。

完整的堆栈跟踪是:

Java::JavaLang::NullPointerException: 
from weka.core.Attribute.<init>(weka/core/Attribute.java:303)
from weka.core.Attribute.<init>(weka/core/Attribute.java:290)
from java.lang.reflect.Constructor.newInstance(java/lang/reflect/Constructor.java:423)
from RUBY.<eval>((irb):7)
from org.jruby.RubyKernel.eval(org/jruby/RubyKernel.java:978)
from org.jruby.RubyKernel.loop(org/jruby/RubyKernel.java:1291)
from org.jruby.RubyKernel.catch(org/jruby/RubyKernel.java:1098)
from org.jruby.RubyKernel.catch(org/jruby/RubyKernel.java:1098)
from Users.pgoetze.$_dot_rvm.rubies.jruby_minus_9_dot_0_dot_1_dot_0.bin.irb.<top>(/Users/pgoetze/.rvm/rubies/jruby-9.0.1.0/bin/irb:13)
from java.lang.invoke.MethodHandle.invokeWithArguments(java/lang/invoke/MethodHandle.java:627)

有没有办法在 JRuby 中创建一个空向量,可以作为第二个参数而不是 nil 传递?

如果没有,创建字符串属性的方法可能是什么?

【问题讨论】:

  • Java::JavaLang::NullPointerException旁边是否有堆栈跟踪?
  • 我为它添加了完整的堆栈跟踪。

标签: java jruby weka


【解决方案1】:

作为JRuby wiki states,您应该使用反射来获取对指定其参数类型的构造函数的引用。

java_import java.util.List
java_import weka.core.Attribute
#...
constructor = Attribute.java_class.declared_constructor(java.lang.String, java.util.List)
attribute = constructor.new_instance('name', nil)

注意事项:

【讨论】:

  • 谢谢,使用反射并从显式构造函数创建属性有效!但是,您不能仅使用单个 String 参数来使用构造函数,因为创建的 Attribute 在内部被 Weka 处理为 nominal 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2016-04-05
  • 2018-12-07
  • 2012-09-08
  • 1970-01-01
  • 2018-03-27
  • 2020-02-20
相关资源
最近更新 更多