Использовать метод по реальному типу - PullRequest
1 голос
/ 10 октября 2011

Я узнал, что я могу использовать реальный тип объекта, чтобы определить, какой метод используется, например, так:

[...]
Object foo = new String("hello");
[...]
bla(foo);

void bla(String x){
}
void bla(Integer x){
}

Теперь он должен использовать метод bla(String x), но вместо этого я получаю компиляторошибка.Я знаю почему: потому что тип foo в настоящее время Object.Я не уверен, правильно ли я сейчас это делаю, но я так понял, что Java выберет метод по реальному типу (или конкретному типу), поэтому, если я уменьшу его до Object, он выберет String вместо этого, если не указан Object Метод.

Или это единственный способ определить тип по if(foo instanceof xxx) в методе void bla(Object x)?

PS: не поймите меня неправильнона этом: я не имею в виду, что я могу перегрузить методы, я имею в виду, что я хочу выбрать метод, основанный на реальном типе (не на определенном)!

Ответы [ 2 ]

1 голос
/ 10 октября 2011

Теперь нужно использовать метод bla (String x), но вместо этого я получаю ошибку компилятора.

правый. Какой метод должен вызываться во время выполнения, выбирается во время компиляции, и компилятор не может (вообще) сказать, какой тип foo будет иметь во время выполнения.

... так что, если я опустил его до объекта ...

Вы не можете "опуститься до объекта". Вы можете понизить до String, хотя. И это правильно, если вы сделаете

bla((String) foo);

вызовет bla, который принимает String в качестве аргумента (и выдает ClassCastException, если foo не является String).

Или это единственный способ определить тип с помощью if (foo instanceof xxx) в методе void bla (Object x)?

[...]

Я имею в виду, что я хочу выбрать метод, основанный на реальном типе (не на определенном)!

Обычно это называется double или многократная отправка , и эта функция не поддерживается в Java.

Реализуйте шаблон посетителя, если он вам действительно нужен.


Кстати, то, что вы называете «определенным типом» и «реальным типом», обычно называют статическим типом и типом времени выполнения соответственно. То есть Object - это статический тип из foo, в то время как String - это тип времени выполнения .

0 голосов
/ 10 октября 2011

Да, вы должны использовать instanceof, чтобы получить реальный тип. bla (Object) всегда будет вызывать метод bla (Object o).

Примечание. Выбор метода на основе «реального типа» возможен только для методов класса. объект.метод (...). Выберет метод, основанный на «реальном типе», если он существует (и поднимется до Object).

Object foo = new String("hello");

// this will return "hello" although toString() 
// from Object only prints the reference
System.out.println( foo.toString() );
...