2011-04-17 100 views
2

這是Java 1.6接口:如何返回一個泛型類型而不明確指定其參數?

interface Foo<T extends Foo<T>> { 
} 

這是一個工廠,它應該返回"Foo<Foo>"

interface Factory { 
    <T extends Foo<T>> Foo<T> find(); 
} 

不能編譯工廠類:

incompatible types; inferred type argument(s) java.lang.Object do not conform 
to bounds of type variable(s) T 
[ERROR] found : <T>Foo<T> 
[ERROR] required: java.lang.Object 

這裏有什麼問題?

回答

2

我可以編譯工廠類:

class MyFoo implements Foo<MyFoo> { } 

    Foo<MyFoo> foo = new Factory() { 
     public <T extends Foo<T>> Foo<T> find() { 
      return null; 
     } 
    }.find(); 

然而,有用,因爲該接口的實現可以得到的,因爲裏面find()代碼有發現沒有辦法T在任何特定調用代表什麼,因此不能實例化一個T

如果你的工廠應該只創建一個特定類型的實例,給工廠的類型參數:

interface Factory<T> { 
    T find(); 
} 

class MyFactory implements Factory<MyFoo> { 
    MyFoo find() { return new MyFoo(); } 
} 

如果它創建任意類型的實例,通過預期的類型find()

class Factory { 
    <T extends Foo<T>> find(Class<T> clazz) { 
     return clazz.newInstance(); 
    } 
} 

MyFoo myFoo = new Factory().find(MyFoo.class); 

最後,請注意工廠在存儲庫找到它們時創建對象。你是在聲明一個存儲庫還是一個工廠?你的API的調用者可能會澄清一下。

+0

感謝您的解釋,幫助很多。在我的用例中,我希望'Factory.find()'返回'Foo ',總是(在問題中提到)。在這種情況下,我應該如何聲明'find()'? – yegor256 2011-04-17 15:00:05

+3

'Foo '不是一個完整的類型,因爲'Foo'需要一個類型參數。也許'Foo '? – 2011-04-17 15:04:14

+0

@Paulo你是對的,'Foo '工作正常。如果您將它發佈爲答案,我很樂意將其選爲最佳答案。 – yegor256 2011-04-17 15:10:58

相關問題