使用泛型信息在JRuby中对Java类进行子类化

时间:2014-04-29 19:41:05

标签: ruby generics jruby akka

我正在尝试使用JRuby使用最新的Akka版本(现在为2.3.2)创建一个actor。问题是,我一直收到错误:

Java::JavaLang::IllegalArgumentException: erased Creator types are unsupported, use Props.create(actorClass, creator) instead

基本上,我正在Akka Documentation

上关注此处的代码

我无法创建akka.japi.Creator,因为这需要通用信息,并且这些信息在运行时被删除(而JRuby基本上是一个运行时 - 无处不在)。我已经尝试过了:

class GreetingActor < UntypedActor
  def onReceive(message)
    if (message.is_a? Greeting)
      puts("Hello " + message.who)
    end
  end
end

system = ActorSystem.create("MySystem")
greeter = system.actorOf(Props.create(GreetingActor))

最后一行以erased Creator types are unsupported失败。我试图将它包装在akka.japi.Creator下,但出现同样的错误(因为Creator需要泛型信息,而JRuby不提供它)。我试过用“become_java!”在GreetingActor上,但它返回nil(如果Ruby类从Java类扩展,JRuby不能从Ruby类创建新的java类。)

有没有办法声明Creator传递泛型信息?

2 个答案:

答案 0 :(得分:2)

我试图做同样的事情,虽然我没有回答标题的问题,但我确实有一个答案可以让这个例子有效。您必须使用不同的方法来构造Props实例。

您需要使用工厂:

java_import 'akka.actor.UntypedActorFactory'

class GreetingActorFactory
  include UntypedActorFactory
  def create
    GreetingActor.new
  end
end

然后您可以按如下方式使用它:

system = ActorSystem.create("GreetingSystem")
props = Props.create(GreetingActorFactory.new)
greeter = system.actorOf(props, "greeter")
greeter.tell(Greeting.new("John Weathers"), nil)

希望这有助于您进一步发展!

答案 1 :(得分:0)

我已经使用以下要点解决了Akka问题:https://gist.github.com/mauricioszabo/6a713fd416c512e49f70

但是,JRuby实现可能会在依赖于未擦除类型的其他库上失败,但是现在,我可以使用上面的代码在Akka中解决。