第一次海报。我已经使用 Java 几年了,并决定学习 D。在 Java 中,您可以声明一个具有泛型类型的类,并从该类创建一个新对象。喜欢:
public class foo<T>
{
public foo() { ... }
}
然后简单地调用foo<String> f = new foo<>();
.我试图在 D 中实现相同的功能,但出现编译错误,例如:“class core.collection.RingBuffer.RingBuffer(T) is used as a type”。查看D的教程,我发现泛型编程是使用模板实现的。但是,我无法确定官方的正反面 tutorials/docs .有人可以向我解释一下吗?谢谢。
最佳答案
当您没有在右侧实例化模板时会出现该错误 - 它会提示“foo 被用作一种类型”,因为 foo 本身还不是一种类型,它是一种类型的模板。这意味着在用 !(arguments) 实例化之前,它不会成为实际类型。
您的 Java 代码 new foo<>()
在 D 中不完全是这样:在 D 中,您需要在右侧给出类型。
所以尝试:
foo!string f = new foo!string();
或
foo!(string) f = new foo!(string)();
模板参数周围的括号,在 !
之后, 如果后面只有一个单词,则为可选,因此这两个意思相同。
在 D 中不需要将类型写两次,但与其将其留在右侧,不如通过类型推断将其留在左侧。这也会编译:
auto f = new foo!string();
这在 D 中很常见。
关于templates - 类的 Dlang 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28645999/