java - Java:与实现接口的类不兼容的返回类型
问题描述
我有一个接口和一个实现:
// there are things
public interface Thing { /* ... */ }
// balls are things
public class Ball implements Thing { /* ... */ }
我有另一个接口和另一个实现:
// a dog can fetch any thing
public interface Dog {
public Thing fetch();
}
// a shepherd can fetch only a ball
public class Shepherd implement Dog {
public Ball fetch() { /* ... */ }
}
这可以。
但现在我想Ball
用作参数化类的参数:
public interface Dog {
public List<Thing> fetchList();
}
public class Shepherd implement Dog {
public List<Ball> fetchList() { /* ... */ }
}
Java 不允许我这样做,它说我正在尝试使用不兼容的类型。
同时,这个结构没有任何问题:
public class Shepherd implement Dog {
public List<Thing> fetchList() { /* ... */ }
}
为什么 Java 允许我使用接口的实现作为返回值的定义,但不允许我使用它作为参数化类的参数?
提前致谢!
解决方案
因为不是每Thing
一个都是一个Ball
您可以尝试像这样参数化超级类型
public interface Dog<T extends Thing> {
public List<T> fetchList();
}
public class Shepherd implement Dog<Ball> {
public List<Ball> fetchList() { /* ... */ }
}
推荐阅读
- python - 在 groupby 和 melt 之后将数据帧转换为嵌套的 JSON
- amazon-web-services - AWS Secret Manager - 在仅设置特定委托人列表时授予所有人访问权限
- git - 通过 git 在 repo 和服务器之间自动同步,忽略但不从源中删除 .gitignore 中的文件
- java - 启用 MethodSecurityInterceptor 以发布 AuthorizedEvent
- android - Why Robo tests gets marked as passed so quickly?
- python - 为图像添加透明填充
- azure - Azure 数据工厂如果条件未按预期工作
- javascript - 如何等待函数在javascript中完成?
- plasticscm - 在 Plastic SCM 中,是否有合并 Oracle Forms 二进制文件的选项或工具?
- swift - MapKit 聚类在开始时没有正确聚类,它在平移后聚类