缩小继承的返回类型(涉及泛型)

时间:2010-01-26 15:46:36

标签: java generics

我正在努力解决在子类化时能够“缩小”返回类型的一些奇怪的泛型行为。我设法将问题减少到以下几组:

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类型的返回类型ITreeService for getService()需要未经检查的转换以符合AbstractServiceTest类型中的V

为什么ITreeService不是getService的有效缩小类型?

编辑:将错误更改为警告

2 个答案:

答案 0 :(得分:5)

因为我认为你的意思是这样说:

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

除了添加子类无法实现的约束之外,创建单独的V类型变量没有任何意义。 :-P

答案 1 :(得分:3)

如果您希望同一AbstractServiceTest的{​​{1}}与V不同,则可以执行以下操作:

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