2014-01-27 180 views
1

假設我有以下類:抽象類和泛型

public abstract class AbstractClass { 
    ... 
} 

public class ConcreteClass extends AbstractClass { 
    ... 
} 

建設者:

public class Builder{ 
    static public ConcreteClass build(){ 
     ... 
    } 
} 

和通用功能的一些其它類:

public <T extends AbstractClass> T myFunction(){ 
    T a = Builder.build(); 
    return a; 
} 

這是我的理解編譯器應該有足夠的信息來允許這樣的賦值,但是,它會拋出一個錯誤:

Type mismatch: cannot convert from ConcreteClass to T

爲什麼是這樣的,這種轉讓的潛在危險是什麼?

+0

爲什麼你想讓它在T上泛化,當你只想返回'AbstractClass'? –

+1

正如你試圖使用繼承的生成器模式可能[這篇文章在這裏](http://stackoverflow.com/questions/21210870/in-java-can-you-use-the-builder-pattern-with-required - 和 - 可重新分配的字段/ 21211472#21211472)可能會有所幫助,雖然它在這篇文章中有點錯位,因爲我在發佈該文章後完全理解了這個問題。 –

+0

也許這個例子有點太簡單了,我只是想展示賦值部分的例子,其他的都是不相關的。 –

回答

2

有人可能會這樣寫:

public class OtherConcreteClass extends AbstractClass { 
    ... 
} 

... 

SomeOtherClass soc = SomeOtherClass.<OtherConcreteClass>myFunction(); 

在調用給myFunction,T是OtherConcreteClass,你可以不投具體類來OtherConcreteClass。

+0

感謝您的解釋! –

0

簡而言之:T不一定是ConcreteClass,它也可以是ConcreteClass的任何兄弟(例如,如果你聲明ConcreteClass2也擴展了ConcreteClass)。