在java中通过返回类型重载方法

时间:2008-11-24 14:05:09

标签: 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();

这个想法是为外部世界提供一个干净的保存界面,并从包可见的实现方法中方便地访问(没有向下转换)。我的Field类有一些方法,我不希望客户看到它,但需要从同一个包中的其他类调用(例如setLabel等)。

4 个答案:

答案 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)

你可以用字节码操作来做,检查这篇文章: http://today.java.net/pub/a/today/2008/07/31/return-type-based-method-overloading.html