课程的Dlang泛型

时间:2015-02-21 12:51:19

标签: java templates generics d

第一次发表海报。我已经使用Java几年了,并决定学习D.在Java中,你可以声明一个具有泛型类的类,并从该类创建一个新对象。像:

public class foo<T>
{
    public foo() { ... }
}

然后只需致电foo<String> f = new foo<>();。我尝试在D中实现相同的,但我得到了一个编译错误,如:“class core.collection.RingBuffer.RingBuffer(T)用作类型”。看一下D的教程,我发现泛型编程是使用模板实现的。但是,我无法做出官方tutorials/docs的正面或反面。有人可以向我解释一下吗?感谢。

3 个答案:

答案 0 :(得分:5)

当您没有在右侧实例化模板时出现错误 - 它抱怨“foo被用作类型”因为foo本身不是类型,它是类型的模板。这意味着在用!(arguments)实例化之前它不会成为实际类型。

您的new foo<>()的Java代码与D中的代码不完全相同:在D中,您需要在右侧给出类型。

所以试试:

foo!string f = new foo!string();

foo!(string) f = new foo!(string)();

!之后的模板参数的括号是可选的,如果后面只有一个单词,那么这两个意思相同。

在D中不需要两次写入类型,但是不要将其从右侧移出,而是可以通过类型推断将其留在左侧。这也将编译:

auto f = new foo!string();

这在D中很常见。

答案 1 :(得分:4)

这是一个使用泛型的简约Java代码:

class Foo <T>
{
    public Foo (String arg) {System.out.println ("Hello, " + arg + "!");}
}

public class TestClass
{
    public static void main (String [] args)
    {
        Foo <String> f = new Foo <> ("Alice");
        Foo <String> g = new Foo <String> ("Bob");
    }
}

这是它的D等价物:

import std.stdio;

class Foo (T)
{
    public this (string arg) {writeln ("Hello, " ~ arg ~ "!");}
}

void main ()
{
    auto f = new Foo !(string) ("Alice");
    Foo !(string) g = new Foo !(string) ("Bob");
}

这些只是完整的可编辑示例。 Adam D. Ruppe's answer中解释了推理。

答案 2 :(得分:0)

...并使用默认参数

template DataList( Data = string )
{
    class DataList
    {
        Data data;

        this()
        {
            // ...
        }
    }
}

// 
auto list = new DataList!string();

// readable
alias DataList!string List;

auto l = new List();