Вызов Перегруженные методы с тройным оператором?

Каково правило, что я не могу вызвать перегруженные методы с проверкой 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) {
            //
        }
    }
}

Южная Каролина

Всего 3 ответа


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

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

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

Object obj = getObject();

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

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

ПОДСКАЗКА

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

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

НЕТ !!! load(Object s) для экземпляра String и Object .


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

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

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

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