我可以使用泛型将这两个“getFields”方法合并为一个(第二个方法是打包私有访问)还是应该将第二个方法重命名为丑陋的“getFieldPackagePrivate”?
public interface IField {
}
class Field implements IField { // package private class
}
public class IForm {
public List<IField> getFields();
}
public class Form {
private List<Field> fields;
public List<IField> getFields() {
return this.fields;
}
List<Field> getFields() { // package visible
return this.fields;
}
}
基本用法就像这样
// by interfece - from client code
IForm form;
List<IField> list = form.getFields();
// by class - from other classes in the same package
Form form2;
List<Field> list2 = forms2.getFields();
这个想法是为外部世界提供一个干净的保存界面,并从包可见的实现方法中方便地访问(没有向下转换)。我的Field类有一些方法,我不希望客户看到它,但需要从同一个包中的其他类调用(例如setLabel等)。
答案 0 :(得分:3)
你可以写(根据我对你上一个问题的回答):
public List<? extends IField> getFields()
但是您不能通过返回类型重载,并且不能在公共方法中公开包私有类型。
编辑:随着问题的变化,答案是简单的“不”。你必须重命名你的其他方法。答案 1 :(得分:3)
没有。您不能基于Java中的返回类型获得多态性。
答案 2 :(得分:0)
经过一段时间的实验,我找到了一个基于Jon Skeet答案的解决方案
代码看起来像这样。
public interface IField {
}
class Field implements IField { // package private class
}
public class IForm {
public List<? extends IField> getFields();
}
public class Form {
private List<Field> fields;
List<? extends Field> getFields() { // package visible - please note "extends Field" not "extends IField"
return this.fields;
}
}
现在下面的dote工作
IForm form;
List<IField> list = form.getFields();
// by class - from other classes in the same package
Form form2;
List<Field> list2 = forms2.getFields();
答案 3 :(得分:0)