40

以下に電話するにはどうすればよいstart()ですか?

package com.example.test;

class Bar {}

public class Foo<K>
{
    final private int count;
    final private K key;

    Foo(Builder<K> b)
    {
        this.count = b.count;
        this.key = b.key;
    }

    public static class Builder<K2>
    {
        int count;
        K2 key;

        private Builder() {}
        static public <K3> Builder<K3> start() { return new Builder<K3>(); }
        public Builder<K2> setCount(int count) { this.count = count; return this; }
        public Builder<K2> setKey(K2 key) { this.key = key; return this; }
        public Foo<K2> build() { return new Foo(this); }
    }

    public static void main(String[] args)
    {
        Bar bar = new Bar();
        Foo<Bar> foo1 = Foo.Builder.start().setCount(1).setKey(bar).build();
        // Type mismatch: cannot convert from Foo<Object> to Foo<Bar>

        Foo<Bar> foo2 = Foo.Builder<Bar>.start().setCount(1).setKey(bar).build();
        // Multiple markers at this line
        // - Bar cannot be resolved
        // - Foo.Builder cannot be resolved
        // - Syntax error on token ".", delete this token
        // - The method start() is undefined for the type Foo<K>
        // - Duplicate local variable fooType mismatch: cannot convert from Foo<Object> to Foo<Bar>

        Foo<Bar> foo3 = Foo<Bar>.Builder.start().setCount(1).setKey(bar).build();
        // Multiple markers at this line
        // - Foo cannot be resolved
        // - Syntax error on token ".", delete this token
        // - Bar cannot be resolved     
    }
}
4

4 に答える 4

44

あなたは近かった:

Foo.Builder.<Bar> start().setCount(1).setKey(bar).build();

乾杯!:)

PS コンパイラがメソッドの型パラメータを独自に推測できない場合は、 を呼び出して強制できますobj.<Type> method(...)

使用したい PPS:

public Foo<K2> build() {
    return new Foo<K2>(this);
}

生の型の使用は避けてください。

于 2010-07-08T14:33:01.800 に答える
29

Andrei の方法は問題ありませんが、ほとんどのプログラマーは、あまり知られていない構文に苦労するでしょう。次の方法で使用する方が簡単かもしれません。

static public <K3> Builder<K3> start(Class<K3> cls) { return new Builder<K3>(); }

Foo<Bar> foo1 = Foo.Builder.start(Bar.class).setCount(1).setKey(bar).build();

クラスは、ジェネリック型を支援するためにのみ渡されます。きれいではありませんが、少なくとも構文は常識です。

別のオプションは、ジェネリック型のオブジェクトからすぐに開始することです。

Foo<Bar> foo1 = Foo.Builder.startWithKey(bar).setCount(1).build();
于 2010-07-08T14:40:11.070 に答える
16

あなたがロンボクプロジェクトのファンであり、その注釈@Builderを使用してビルダーパターンを実現している場合は、書いているように不要なコードをすべて削除して、より少ないコードで実行できます。

例:

@Builder
public class ErrorResponse<T> {
    private String message;
    private List<String> reasons;
    private List<String> details;
    private T data;
}

そして、次のように初期化できます。

ErrorResponse<MyData> myDataError = ErrorResponse.<MyData>builder()
.message("My message")
.build();
于 2020-07-02T07:11:19.477 に答える