.NET では、配列とリストの両方が祖先として Enumerable を持っているため、Enumerable を引数として受け入れるメソッドは、配列とリストの両方を引数として受け取ることができます。Javaにも似たようなものがあるのだろうか?
6 に答える
いいえ、Java には同等のものはありません。List<T>
通常は、Collection<T>
またはを受け取る API メソッドを設計することをお勧めしますIterable<T>
。これらは配列を使用してメソッドを直接呼び出すことを妨げますが、 を使用して配列を非常に簡単にラップできますArrays.asList
。これは、単一の実装を強制するメソッド パラメーターとして配列を指定するよりも、呼び出し元にとってより柔軟です。
私はそれが理想的ではないことに同意します。
.NET では、1 次元配列は実装するだけでなく、実装も行うことに注意してIEnumerable<T>
くださいIList<T>
。
共通の祖先はありませんが、必要に応じて 2 つの型の間でキャストするメソッドがあります。
したがって、オーバーロードされたメソッドを提供して、共通の型にキャストすることができます-つまり
public void doAll(MyType[] array) {
doAll(Arrays.asList(array));
}
public void doAll(List<MyType> list) {
//... process List here.
}
Java の配列とリストは、java.lang.Object 以外の共通の祖先を共有していません。
両方とも、次のように foreach ループを使用してアクセスできます。
String [] array = new String [] { "foo", "bar", "baz", };
List<String> list = Arrays.asList( "x", "y", "z");
for (String s : array)
System.out.println(s);
for (String s : list)
System.out.println(s);
基本的に、配列には object のサブクラスである暗黙の型があります。JLS の配列を参照してください。
public static void main(String[] args) {
int[] ia = new int[3];
System.out.println(ia.getClass());
System.out.println(ia.getClass().getSuperclass());
}
> class [I
> class java.lang.Object
共分散/反分散を考慮すると、配列とリストの処理方法も同じではありません。
List<Object> l = new ArrayList<String>(); // complain
Object[] l2 = new String[1]; // ok
l2[0] = 4; // throw ArrayStoreException.
ジェネリックを考慮するとさらに悪化しますが、それは別のトピックです. 全体として、この設計の論理的根拠はわかりませんが、それと一緒に暮らす必要があります。
どちらも から派生しjava.lang.Object
ます。ただし、これはコレクション関連ではなく、探しているものだと思います。
Iterable<T>
に相当する Java ですIEnumerable<T>
。すべて/ほとんどのコレクションがこのインターフェイス (ArrayList
および配列を含む) を実装しているため、そうです。しかし、これは「祖先」ではなく (.NET にもありません)、共通のインターフェイスです。