2017-02-08 11 views
1

私はむしろ奇妙な質問をしていますが、私は現在読んでいる本に従ってください。なぜ配列参照で直接asList()を呼び出すことができないのですか?

今、私はCollectionsについて学んでいて、配列をListに変換する方法を学んでいます。例えばのために

String[] colors = {"red", "blue", green", "white", "orange"}; 
List<String> list = Arrays.asList(colors); 

私の質問は、なぜ私たちは、直接メソッドを呼び出すことはできませんか? Stringクラスの一方

String[] colors = {"red", "blue", green", "white", "orange"}; 
colors.asList(); 

、我々はメソッドを呼び出すことによって直接大文字を言うために、文字列オブジェクトに変換することができますか?

String[] colors = {"red", "blue", green", "white", "orange"}; 
String result = colors.toUpperCase(); 
+1

いいえ 'colors.toUpperCase();'もコンパイルされません。 – CKing

+0

Arrayクラスはずいぶん前に設計されていて、多くの静的メソッドはインスタンスメソッドでなければなりませんでしたが、これを変更するには遅すぎます。 – stt106

答えて

2

私の質問は、なぜ私たちは、直接メソッドを呼び出すことはできませんでしょうか?

メソッドが配列型クラスのいずれにも存在しないため、メソッドを呼び出すことはできません。クラスで定義されていないメソッドを呼び出すことはできません。たとえば:

class MyClass { 
    public void method() { } 
} 

あなたは、このメソッドを持っていないnew MyClass().whyCantICallThisMethod()MyClassためと言うことはできません。

つまり、配列はJVMによって(実行時に)作成されるので、他のクラスとは異なります。設計者は、asListメソッドを動的に追加するようにJVMに依頼するのに適しているとは思わなかった。

+0

という数百万行のコードが壊れてしまいます。だから、配列を作成するときに型クラスであることが知られていますか?それは実際に配列クラスライブラリにリンクしていませんか? – Scorpiorian83

+0

@ Scorpiorian83 'Array'クラスが' String [] 'や' int [] 'や他の配列型にリンクされているかどうかを調べる場合、答えはもう一度ありません。 'Array'はユーティリティメソッドを含むクラスであり、' String [] 'や' int []'や他の配列型のクラスオブジェクトとは異なります。 – CKing

0

静的メソッドはクラス名を使用して呼び出され、インスタンスメソッドはインスタンス上で呼び出されます。 asList()Arraysクラスの静的メソッドとして定義されているため、Arraysクラスのインスタンスを作成する必要はありません。代わりに<Class-Name>.<Static-Method>と入力してください。あなたの場合はArrays.asList()です。

したがって、String[] colors配列のコード例では、asList()メソッドを呼び出すことはできません。

また、toUpperCase()メソッドは文字列の配列では機能しません。むしろStringオブジェクトで呼び出すことができます。

関連する問題