【问题标题】:Subclassing a Java class in JRuby, with Generics information使用泛型信息在 JRuby 中子类化 Java 类
【发布时间】:2014-04-29 19:41:05
【问题描述】:

我正在尝试使用 JRuby 使用最新的 Akka 版本(现在是 2.3.2)创建一个演员。问题是,我不断收到错误消息:

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 类)。

有没有办法声明创建者传递泛型信息?

【问题讨论】:

    标签: ruby generics jruby akka


    【解决方案1】:

    我试图做同样的事情,虽然我没有对标题问题的答案,但我确实有一个让示例正常工作的答案。您必须使用不同的方法来构造 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)
    

    希望这可以帮助您走得更远!

    【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      相关资源
      最近更新 更多