0

我有一个工厂方法,它接收一个类并返回一个实例。在Java中,我可以这样表达:

爪哇

class InstantiateMe { }

// Generic factory method
class Factory {

  public static <V> V createInstance(Class<V> type) {
    try {
      return type.newInstance();
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

// returns an instance of the class InstantiateMe
Factory.createInstance(InstantiateMe.class);

当试图在冰糕中创建类似的签名时,它最终会出错。静态检查器的错误信息:T.class_of needs a Class as its argument对于Factory#createInstances 的签名。

红宝石/冰糕:

# typed: true
class InstantiateMe; end

class Factory
  extend T::Sig

  sig do
    type_parameters(:V)
    params(klass: T.class_of(T.type_parameter(:V)))
    .returns(T.type_parameter(:V))
  end
  def self.createInstance(klass)
    klass.new
  end

end

Factory.createInstance(Factory)

在线查看:sorbet.run

我当然明白接受课程的意义。但是,T.type_parameter(:V)实际上是在表达一个变量类。所以它也应该被接受。与 Java 中接受的方式相同。

但是,也许我只是表达错误。在冰糕中编写通用工厂签名的正确方法是什么?

4

1 回答 1

0

简短的回答是 Sorbet 现在不支持它。它没有 Generic 的表达式,T.instance_of(:X)T.class_of不能与 Generic 一起使用。我们已经在 sorbet slack 中多次提出这个讨论,但目前实现此类功能并不是他们的优先事项。

于 2020-06-09T17:52:43.547 回答