我正在努力解决在子类化时能够“缩小”返回类型的一些奇怪的泛型行为。我设法将问题减少到以下几组:
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
的有效缩小类型?
编辑:将错误更改为警告
答案 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