[英]Overloading methods by return type in java
我可以使用泛型将这两个“ 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();
这样做的目的是为外界提供一个干净,保存的界面,并从程序包可见的实现方案中方便地访问(不进行向下转换)。 我的字段类有一些我不希望客户端看到的方法,但需要从同一包中的其他类中调用(例如setLabel等)。
您可以写(按照我对上一个问题的回答):
public List<? extends IField> getFields()
但是您不能按返回类型重载,也不能在公共方法中公开包专用类型。
编辑:随着问题的改变,答案是一个简单的“否”。 您必须重命名其他方法。
不可以。您不能在Java中基于返回类型实现多态。
您可以通过字节码操作来做到这一点,请查看以下文章: http : //today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html
经过一些实验后,我发现了基于乔恩·斯凯特(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;
}
}
现在下面的宠爱了
IForm form;
List<IField> list = form.getFields();
// by class - from other classes in the same package
Form form2;
List<Field> list2 = forms2.getFields();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.