2015-11-16 49 views
2

我尝试通过JRuby使用Java Weka机器学习库。它工作正常,到目前为止,只有一两件事我想知道:JRuby等效于将null转换为类

为了创建一个字符串属性,您可以使用相同的构造器为在Java中名义属性,但第二个参数被浇铸FastVector空:

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通过?

如果没有,那么可以通过什么方式来创建一个字符串属性?

+0

什么是有一个堆栈跟踪'Java的旁边:: JavaLang :: NullPointerException'? –

+1

我为它添加了完整的堆栈跟踪。 –

回答

2

As 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) 

注:

+0

谢谢,使用反射并从显式构造函数创建属性!尽管如此,您不能仅使用单个String参数来使用构造函数,因为创建的Attribute在内部由Weka作为* nominal *属性处理。 –