2

Java 1.7 で以下の構文をサポートする理由は何ですか?

List<Integer> ints=new ArrayList<>();

それはどのような柔軟性を提供しますか? int を別の型にしたい場合は、明示的にキャストし、変換を実行できない場合はエラーをスローします。

また、これがどのように機能するかについても明確ではありません.Listはインターフェースであるため、どのようにしてメソッドを呼び出すことができますか

List<Integer> ints = Arrays.asList(1,2);
ints.get(1);

の戻り値の型なので、実装を提供するクラスがなくても静的インターフェイスのフィールドにアクセスしても問題ありません。しかし、そのようなインターフェイスのメソッドにアクセスするにはどうすればよいでしょうか。コレクション ライブラリには、次のようなものがたくさんありasList()ます 。これらの方法の?static<T> List<T>Collections.Sort()

4

6 に答える 6

4

質問1

使用する

List<Integer> ints=new ArrayList<>();

それ以外の

List<Integer> ints=new ArrayList<Integer>();

それらは完全に同等であるため、柔軟性は追加されません。ひし形(<>)は、rawタイプではなく、明らかなパラメーター化されたタイプが必要であることを示します。

オラクルはここでそれを説明しています:

Java SE 7では、コンストラクターのパラメーター化された型を、空の型パラメーターのセット(<>)に置き換えることができます。

コードの冗長性が少し減り、読みやすく、保守しやすくなります。これはおそらくOracleの例でより明白です:

Map<String, List<String>> myMap = new HashMap<>();

に比べ

Map<String, List<String>> myMap = new HashMap<String, List<String>>();

質問2

Arrays.asList(1,2);Listインターフェースを実装する具象クラスからオブジェクトを返します。

Java 1.6では、これは固定サイズのインスタンスですjava.util.Arrays.ArrayList

3354    public static <T> List<T> asList(T... a) {
3355        return new ArrayList<T>(a);
3356    }

ただし、重要な点は、オブジェクトは常に、そのインターフェイスが定義するメソッドを実装する具象クラスであるということです。

あなたがしているとき、あなたはインターフェースCollections.sort(を使用していませんが、この非常に具体的なコードを含むCollectionsクラスを使用しています:Collection

132     public static <T extends Comparable<? super T>> void sort(List<T> list) {
133         Object[] a = list.toArray();
134         Arrays.sort(a);
135         ListIterator<T> i = list.listIterator();
136         for (int j=0; j<a.length; j++) {
137             i.next();
138             i.set((T)a[j]);
139         }
140     }
于 2012-11-08T11:34:03.293 に答える
0
List<Integer> ints=new ArrayList<>();

is exactly the same as writing

List<Integer> ints=new ArrayList<Integer>();

It doesn't add flexibility, it just let you keep generics with your ArrayList whithout having to retype the type of the ArrayList, and so the ArrayList will not use raw type.

Some other thing is that writing this, you only get directly access to the List interface methods on your ArrayList object, event if these methods will have the behavior that is defined in the ArrayList class.

于 2012-11-08T12:00:22.740 に答える
0
List<Integer> ints=new ArrayList<>();

そのジェネリックは理解しやすく、反復しやすい

for(Integer intObj : ints ) {}

それ以外の

Iterator itr = ints.iterator() ;
while(itr.hasNext()) {
   Integer intObj = (Integer) itr.next();
}

の戻り値の型Arrays.asList()は静的なので?

はいjava.util.Arrays、ユーティリティ クラスは多くのユーティリティ メソッドを提供します。

しかし、どうすればそのようなインターフェースのメソッドにアクセスできるのでしょうか?

そこのソースコードを表示するだけで、インターフェースArrayListから実装メソッドを見つけることができListます。

これらのメソッドの実装を提供するのは誰ですか?

List Setなどのインターフェースを実装する人

于 2012-11-08T11:49:54.503 に答える
0

それはどのような柔軟性を提供しますか?

柔軟性はありません。単なる構文シュガーリングです。最新のIDEコード補完はすでにそれを行っているため、無意味です。

asList() の戻り値の型は static List であるため、実装を提供するクラスがなくても静的インターフェイスのフィールドにアクセスしても問題ありません。しかし、そのようなインターフェイスのメソッドにアクセスするにはどうすればよいでしょうか。コレクション ライブラリにはそれらがたくさんあります。 Collections.Sort() のようなこれらのメソッドの実装を提供するのは誰ですか?

の戻り値の型asList()は List です。タイプは、メソッドが静的であるという事実とは何の関係もありません。Arraysインターフェイスではなくクラスであり、そこに asList() メソッドが実装されています。JDK が実装を提供します。

于 2012-11-08T12:05:22.773 に答える
0

あなたの質問にはいくつかの質問があります。

ジェネリックはコンパイル時のチェックを提供しますが、キャスト エラーは実行時まで発見されません。

ints は List インターフェイスをサポートするオブジェクトであるため、メソッドを呼び出すことは有効です。

于 2012-11-08T11:35:44.097 に答える
0

これらはコンパイル時のチェックであり、一貫性を確保するように設計されているため、実装は、ジェネリック表記法によって定められた規則に従う限り、特定のことを「行う」必要はありません (たとえば、型 T のオブジェクトで呼び出されるメソッドの場合)。 、同じタイプの何かを返すだけです T)。

指摘されているように、コンストラクターで型を指定することが不必要に冗長であることが明らかになったときに、ダイヤモンド表記が導入されました。コンストラクター。

于 2012-11-08T11:37:37.307 に答える