Вызывать перегруженные методы с троичным оператором? - PullRequest
0 голосов
/ 25 октября 2018

Какое правило, что я не могу вызывать перегруженные методы с проверкой instanceOf с помощью троичного оператора?

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

public class Sample {
    public static void main(String[] args) {
        Object object = new String("");
        Foo.load(object instanceof Integer ? (Integer) object :
                object instanceof String ? (String) object : null);
    }

    public static class Foo {
        public static void load(String s) {
            //
        }

        public static void load(Integer s) {
            //
        }
    }
}

sc

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Разрешение метода выполняется за время компиляции .В конце дня вы передаете некоторое выражение, которое возвращает значение методу.Компилятор проверяет тип выражения и определяет, какой метод он должен вызывать.

Здесь вы пытаетесь написать выражение, которое может возвращать различные типы в соответствии с информацией runtime , и соответственно вызывать метод,И, как вы видели, это просто не будет летать.Вместо этого вы можете явно вызывать различные методы в соответствии с типом (тот факт, что они имеют одинаковые имена, несущественен - ​​они все еще разные методы!):

if (object instanceof Integer) {
    Foo.load((Integer) object); // Calls Foo.load(Integer)
} else if (object instanceof String) {
    Foo.load((String) object); // Calls Foo.load(String)
} else {
    Foor.load(object); // Calls Foo.load(Object)
}
0 голосов
/ 25 октября 2018

В вашем случае, пустая строка или ноль не проверяет равенство ссылок.

Ваше решение будет работать, если Object object = new String("test"); есть.

Кроме того, для примитивных типов, таких как int, float и т. Д., Вам на самом деле не нужен instanceof .. instanceof больше для классов.

Вот ссылка о том, как на самом деле работает instanceof: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

0 голосов
/ 25 октября 2018
Object obj = getObject();

if(obj instanceof Integer)
    load((Integer)obj);
else if(obj instanceof String)
    load((String)obj);
else
    load(obj);

Ошибка, поскольку перегруженный метод был выбран во время компиляции , но не во время выполнения , когда вы используете instanceof.Чтобы переместить эту проверку во время выполнения, используйте, например, if...else.

HINT

load(obj instanceof String ? (String)obj : obj);

Это нормально и не выдает ошибку компиляции, но что делатьВы думаете, какой перегруженный метод будет вызван, когда obj = "some string", load(String s) ???

NO !!! load(Object s) для экземпляров String и Object.

...