【问题标题】:Dynamic Parameter with "or"带“或”的动态参数
【发布时间】:2018-06-30 17:13:16
【问题描述】:

我想知道是否可以这样做:

public String gE(EditText text || TextInputEditText text || BootstrapEditText text){
      return text.getText().toString();
}

感知使用“或”,参数基本上具有相同的属性,但我想要一种方法,我可以传递一个或另一个,而不必为每个元素创建一个。在java中可以做到这一点吗?

【问题讨论】:

  • 传递公共超类引用而不是具体实现:public String gE(Text text)(假设存在公共超类Text)。
  • @Turing85 我不太明白怎么做,你能给我举个例子吗?
  • 只要找一个关于Java继承的教程,例如this one from Oracle.
  • @Turing85 很酷,但是如果它们是按钮呢?我怎么能做这样的方法?
  • @Turing85 和你的第一个例子,我如何将视图转换为 Text 类型以调用该方法?

标签: java android methods


【解决方案1】:

你可以传递一个对象,然后检查它的类型。

public String gE(Object o) {
    if(o instanceof TextInputEditText) {
        return ((TextInputEditText) o).getText().toString();
    }
    else if(o instanceof BootstrapEditText) {
        return ((BootstrapEditText) o).getText().toString();
    }
    else if(o instanceof EditText) {
        return ((EditText) o).getText().toString();
    }
    return null;
}

确保基类是最后检查的条件,否则扩展类的代码将无法访问。例如 - 如果您在 EditText 条件之后检查 TextInputEditText 条件,则对于 EditText 条件它将始终返回 true,因此永远不会检查 TextInputEditText 条件。这是因为TextInputEditText extends EditText

更新 - 使用instanceof 被认为是不好的做法。所以,请改用函数重载。喜欢-

public String gE(TextInputEditText text) {
    return text.getText().toString();
}

public String gE(BootstrapEditText text) {
    return text.getText().toString();
}

public String gE(EditText text) {
    return text.getText().toString();
}

【讨论】:

  • 你最后的 cmets 没有任何意义。如果TextInputEditText extends EditText,则根本没有理由拥有TextInputEditText 块,因为它由EditText 块处理。
  • 是的 Radiodef,我意识到了这一点。但是后来我留下了它,以防开发人员需要为不同类型的对象保留单独的代码。假设getEditableText() 代表TextInputEditTextgetText() 代表EditText。
  • 另见例如stackoverflow.com/questions/30894002/… 讨论为什么像这样使用 instanceof 通常被认为是一种不好的做法。
  • 所以,接受的答案应该是函数重载。我应该编辑我的答案吗?
【解决方案2】:

你不能使用 ||(or) 运算符作为 java 中的函数参数,但你可以通过使用称为函数重载的概念来实现这一点。

如下:

public String gE(EditText text){
    return text.getText().toString();
   }
   public String gE(TextInputEditText text){
    return text.getText().toString();
   }
   public String gE(BootstrapEditText text){
    return text.getText().toString();
   }

在函数重载中,您可以使用不同的参数或参数名称来命名函数。

【讨论】:

  • 这也是一个很好的解决方案。 +1
  • Woton Sampaio 来了 :)
  • 这个解决方案应该优于带有instanceof 的解决方案,它会导致 API 不明确。
  • @RobertHume 问题是我必须写一件事 3 次,你知道为什么吗?想象一下,不是直接返回我想要处理的文本,而是这样我必须为 3 种方法编写,另一个答案是创建一个接收其中一个字段值的字符串,在直接返回,不用写3遍,明白了吗?
  • @Woton Sampaio 您可以编写这三个方法,以便它们的第一行检索字符串值,然后您可以编写第四个方法来对该字符串执行任何操作,并从其他三个。
【解决方案3】:

绝对可以使用包含getText方法的所有接口或父类

【讨论】:

  • 我该怎么做?
【解决方案4】:

如果你有这样的类层次结构:

public class EditText {
    public CharSequence getText() {...}
}
public class TextInputEditText extends EditText { }
public class BootstrapEditText extends EditText { }

那么你可以使用这个:

public String gE(EditText a) { return a.getText().toString(); }

如果你有这样的类层次结构:

public class TextView {
    public CharSequence getText() {...}
}
public class EditText extends TextView { }
public class TextInputEditText extends TextView { }
public class BootstrapEditText extends TextView { }

那么你可以使用这个:

public String gE(TextView a) { return a.getText().toString(); }

子类类型可以作为参数传递给采用其超类类型的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2015-11-30
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多