Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java generics + Builder pattern

How do I call start() below?

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          } } 
like image 581
Jason S Avatar asked Jul 08 '10 14:07

Jason S


1 Answers

You were close:

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

Cheers! :)

P.S. If the compiler can't infer the type parameter of the method on its own, you can force it by calling obj.<Type> method(...) .

P.P.S you might want to use:

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

Avoid using raw types.

like image 130
Andrei Fierbinteanu Avatar answered Oct 12 '22 12:10

Andrei Fierbinteanu