代码之家  ›  专栏  ›  技术社区  ›  Woton Sampaio

带“或”的动态参数

  •  0
  • Woton Sampaio  · 技术社区  · 7 年前

    我想知道是否有可能这样做:

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

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

    4 回复  |  直到 7 年前
        1
  •  2
  •   Sanchita Santra    7 年前

    可以传递对象,然后检查其类型。

    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;
    }
    

    确保基类是最后检查的条件,否则扩展类的代码将无法访问。例如-如果您检查 TextInputEditText 之后的条件 EditText 条件,它将始终返回true 编辑文本 条件等永远不会检查 文本输入文本 条件。这是因为 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();
    }
    
        2
  •  2
  •   JSharma    7 年前

    在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();
       }
    

    在函数重载中,可以用不同的参数或参数名命名相同的函数。

        3
  •  0
  •   Minh Trần    7 年前

    当然,您可以使用包含getText方法的所有接口或它们的父类

        4
  •  0
  •   Radiodef    7 年前

    如果类层次结构如下:

    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(); }
    

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