2010-01-26 54 views
3

我正在琢磨一些關於在子類化時能夠「縮小」返回類型的奇怪泛型行爲。我設法把問題縮小到以下組類:縮小繼承的返回類型(涉及到的泛型)

public class AbstractIndex { 
} 

public class TreeIndex extends AbstractIndex { 
} 

public interface IService<T extends AbstractIndex> { 
} 

public interface ITreeService extends IService<TreeIndex> { 
} 

public abstract class AbstractServiceTest<T extends AbstractIndex> { 
    abstract <V extends IService<T>> V getService(); 
} 

public class TreeServiceTest extends AbstractServiceTest<TreeIndex> { 
    @Override 
    ITreeService getService() { 
     return null; 
    } 
} 

問題是,當我嘗試的getService返回類型縮小到ITreeService是Java的警告。該警告是

類型安全:從TreeServiceTest需要選中轉換成與類型AbstractServiceTest符合伏類型的getService的返回類型ITreeService()

爲什麼不ITreeService一個有效的縮小型getService

編輯:改變錯誤警告

+0

您的代碼編譯並運行在這裏與Java 6 – jarnbjo 2010-01-26 15:54:25

+0

@jarnbjo,它實際上是一個警告不是錯誤 – notnoop 2010-01-26 15:55:41

+0

對不起,是的。我的錯。這是一個警告,而不是一個錯誤。我會更新這個問題。 – JesperE 2010-01-26 16:16:25

回答

5

因爲我覺得你的意思是說這個:

public abstract class AbstractServiceTest<T extends AbstractIndex> { 
    abstract IService<T> getService(); 
} 

沒有什麼目的,使得單獨V類型的變量,不是添加約束等,你的子類可以」完成。 :-P

+0

謝謝。那樣做了。 – JesperE 2010-01-26 16:43:24

3

如果你想擁有AbstractServiceTest s的不同V S爲同一T,你可以這樣做:

public abstract class AbstractServiceTest<T extends AbstractIndex, V extends IService<T>> { 
    abstract V getService(); 
} 

public class TreeServiceTest extends AbstractServiceTest<TreeIndex, ITreeService> { 
    @Override 
    ITreeService getService() { 
     return null; 
    } 
} 

public class AnotherTreeServiceTest extends AbstractServiceTest<TreeIndex, AnotherTreeService> { 
    @Override 
    AnotherTreeService getService() { 
     return null; 
    } 
} 

編輯:但是,它纔有意義,如果你還使用V在其他一些地方,如:

public void setService(V service) { ... }