2017-01-14 7 views
-1

Когда я вызываю s1.dub (7) или s2.dub (7), он не работает , но вызов его строкой типа s2.dub ("9") работает и печатает удвоенную строкуPolymorphic Misunderstand

Может ли кто-нибудь сказать мне, почему?

Вот код

interface Inter { 
    int number(); 
} 
abstract class Abs { 
static int foo = 12; 
    int number() { return 5; } 
    abstract int ace(); 
} 
final class Sub extends Super { 
    Sub(int bar) { foo = bar; } 
    public int number() { return 10; } 
    int ace() { return 13; } 
    int dub(int i) { return 2 * i; } 
} 
public class Super extends Abs implements Inter { 
    public int number() { return 11; } 
    public static void main(String args[]) { 
     Super s1 = new Super(); 
     Super s2 = new Sub(16); 
     //System.out.println(s1.dub(7));  //doesn't work 
     //System.out.println(s2.dub(7));  //doesn't work 
     //System.out.println(s1.dub("7")); //works giving 77 
     //System.out.println(s2.dub("7")); //works giving 77 
    } 
    int twice(int x) { return 2 * x; } 
    public int thrice(int x) { return 3 * x; } 
    int ace() { return 1; } 
    String dub(String s) { return s + s; } 
} 
+0

Я немного устал, но я думаю, это даже не нужно компилировать? –

+0

Отредактировано Сейчас, повторите проверку! –

+0

s1.dub (7) не будет компилироваться, поскольку вы передаете значение int, в то время как единственный метод dub в объекте Super ожидает String. s2.dub (7) также не будет компилироваться, поскольку при создании объекта Sub, который имеет метод, ожидающий int, вы сохраняете его ссылкой как супер, который, опять же, имеет только метод dub, ожидающий строку , При этом вы также должны понимать, почему скомпилируются s1.dub («7») и s2.dub («7»). –

ответ

0

Очень легко .. Вы класс Супер определяет метод:

String dub(String s) { return s + s; } 

в основной метод инстанцировании Супер:

Super s1 = new Super(); // this has a dub(String) method 

тогда вы пытаетесь для вызова этого метода (dub), передающего целое число, вместо строки:

System.out.println(s1.dub(7)); // s1.dub(...) takes a String, not a number 

EDIT: Этот код не должен компилироваться или запускаться, потому что вы назначаете оба экземпляра суперкласс Super (который не определяет метод dub (int)).

Не знаете, как вы получаете исключения?

Спасибо @ Jean-FrançoisSavard - я полностью пропустил это!

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

EDIT3: (последний, из-за первоначального изменения вопроса)

System.out.println(s1.dub(7)); //- this will never work unless you change your class' definition 

System.out.println(s2.dub(7)); //- will work if you also change the following line: 

от:

Super s2 = new Sub(16); 

к:

Sub s2 = new Sub(16); 
+1

* "принимает строку, а не число" * Тогда она не должна компилироваться? ОП говорит об исключении. Вторая часть вашего ответа также неверна –

+0

Вы верны! Он не компилируется на моем компиляторе - обе строки, в которых вы передаете число, имеют ошибки, когда я пытаюсь их скомпилировать. Как вы компилируете этот код? –

+1

Предлагаю вам удалить ответ и продолжить обсуждение в комментариях по этому вопросу. Таким образом, вы избежите downvotes, а также поможет другим понять этот вопрос, поскольку они с большей вероятностью будут искать информацию о комментариях, о которых идет речь, а не о комментариях. –