私はs1.dub(7)またはs2.dub(7)を呼び出すと を呼び出すことはできませんが、s2.dub( "9")のような文字列を呼び出して2倍の文字列を出力します多相誤解
いずれかの理由を教えてください。
ここでコード
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; }
}
私は少し疲れているが、私は考えますこれはコンパイルすべきではありませんか? –
編集しました、再チェックしてください! –
スーパーオブジェクト内の唯一のダブメソッドが文字列を要求している間に、s1.dub(7)はint値を渡すとコンパイルされません。 s2.dub(7)もコンパイルされませんが、intを予期するメソッドを持つSubオブジェクトを作成している間は、Superとして参照を保持しています。また、Stringを期待するダブメソッドしかありません。つまり、なぜs1.dub( "7")とs2.dub( "7")がコンパイルされるのかを理解できるはずです。 –