Javaを勉強していて分からないことがあります。
独習Javaという本で、以下のようなサンプルがあります。
OverloadAnti
1package to.msn.wings.selflearn.chap07.method; 2 3public class OverloadAnti { 4 5 public void show(String value) { 6 System.out.println("String: " + value); 7 } 8 9 public void show(StringBuilder builder) { 10 System.out.println("StringBuilder: " + builder); 11 } 12 13 public void show(StringBuffer buf) { 14 System.out.println("StringBuffer: " + buf); 15 } 16 17 public void show(CharSequence cs) { 18 System.out.println("CharSequence: " + cs); 19 } 20}
OverloadAntiClient
1package to.msn.wings.selflearn.chap07.method; 2 3public class OverloadAntiClient { 4 5 public static void main(String[] args) { 6 var c = new OverloadAnti(); 7 var list = new CharSequence[] { 8 "春はあけぼの", 9 new StringBuilder("夏は夜"), 10 new StringBuffer("秋は夕暮れ"), 11 }; 12 13 for (var cs : list) { 14 c.show(cs); 15 } 16 } 17 18}
結果は、
CherSequence: 春はあけぼの
CherSequence: 夏は夜
CherSequence: 秋は夕暮れ
になると書かれています。
説明としては、CharSequenceの配列を使用しているので、コンパイル時にCharSequenceを引数に取るメソッドが選択されるため。と書かれていました。(p290)
なら試しに、CharSequenceの配列じゃなくしてみました。
Listof
1package to.msn.wings.selflearn.chap07.method; 2 3import java.util.List; 4 5public class OverloadAntiClient { 6 7 public static void main(String[] args) { 8 var c = new OverloadAnti(); 9 var list = List.of( 10 "春はあけぼの", 11 new StringBuilder("夏は夜"), 12 new StringBuffer("秋は夕暮れ") 13 ); 14 15 for (var cs : list) { 16 c.show(cs); 17 } 18 } 19 20}
結果は、変わりませんでした。
CharSequence: 春はあけぼの
CharSequence: 夏は夜
CharSequence: 秋は夕暮れ
コンパイル時にメソッドを決定しているのだとは思いますが、取り合えず配列の型を基準に決めているのは違うのかな?と思います。
何を基準に決めているのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/24 00:46
2020/09/24 00:50