Динамический параметр с "или" - PullRequest
0 голосов
/ 30 июня 2018

Я хотел бы знать, возможно ли сделать что-то вроде этого:

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

Воспринимайте использование "или", параметры в основном имеют одинаковые атрибуты, но я бы хотел, чтобы я мог передать один или другой, не создавая один для каждого элемента. Возможно ли сделать это в Java?

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

Если у вас есть иерархия классов, такая:

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

Типы подкласса могут передаваться в качестве аргументов методам, которые принимают их тип суперкласса.

0 голосов
/ 30 июня 2018

Вы можете передать объект, а затем проверить его тип.

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 для условия EditText и поэтому никогда не будет проверять условие 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();
}
0 голосов
/ 30 июня 2018

Вы не можете использовать оператор || (или) в качестве аргумента функции в java, но вы можете достичь этого, используя концепцию, называемую function over loading.

Как показано ниже:

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

При перегрузке функции вы можете вызывать функцию с тем же именем с другим аргументом или именем параметра.

0 голосов
/ 30 июня 2018

Абсолютно, вы можете использовать интерфейс или родительский класс всех них, который содержит метод getText

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...