我有一个工厂方法,它接收一个类并返回一个实例。在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#createInstance
s 的签名。
红宝石/冰糕:
# 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 中接受的方式相同。
但是,也许我只是表达错误。在冰糕中编写通用工厂签名的正确方法是什么?