繁体   English   中英

Java中按返回类型重载的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM