2010-03-14 6 views
13

.NET에서 array 및 list는 모두 Enumerable을 상위 항목으로 가지므로 Enumerable을 인수로 받아들이는 메서드는 array 및 list를 인수로받을 수 있습니다. Java에서 비슷한 점이 있는지 궁금합니다.공통 조상과 Java 배열 및 목록

답변

20

아니, 자바에서 동등한 없습니다. 일반적으로 List<T>, Collection<T> 또는 Iterable<T>을 수신하는 API 메소드를 설계하는 것이 좋습니다. 이것들은 을 직접적으로 배열로 호출하는 것을 배제하지만 Arrays.asList을 사용하여 배열을 매우 쉽게 감쌀 수 있습니다. 이것은 배열을 메소드 매개 변수로 지정하는 것보다 호출자에게 더 유연합니다. 이는 단일 구현을 강제합니다.

나는 그것이 이상하지 않다는 데 동의한다.

.NET에서 1 차원 배열은 IEnumerable<T>을 구현하는 것이 아니라 IList<T>도 구현합니다. 필요에 따라

1

두 가지 모두는 java.lang.Object에서 파생됩니다. 그러나 이것은 수집과 관련이 없으며, 내가 생각하기에 당신이 찾고있는 컬렉션이라고 생각합니다.

3

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); 
+1

내 언어 혼란스러워 요. 요즘 C#을 읽었습니다. – duffymo

4

그들은 공통 조상이없는, 그러나, 두 가지 유형 사이의 캐스팅 방법이 있습니다 -

그래서 당신이 오버로드 제공 할 수 공통 유형으로 변환하는 방법 - 예 :

public void doAll(MyType[] array) { 
    doAll(Arrays.asList(array)); 
} 

public void doAll(List<MyType> list) { 
    //... process List here. 
} 
2

기본적으로 배열에는 객체의 하위 클래스 인 암시 적 유형이 있습니다. JLS에 Arrays를 참조하십시오 : 우리가 covariance/contravariance을 고려할 때

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. 

제네릭을 고려해 보면 더 심해지지만 다른 주제입니다. 대체로이 디자인의 근거는 모르겠지만 함께 살 필요가 있습니다.

1

Iterable<T>IEnumerable<T>과 같습니다. 모든/대부분의 콜렉션은이 인터페이스 (ArrayList 및 배열 포함)를 구현합니다. 그렇습니다. 그러나 그것은 "조상"(.NET에서는 그렇지 않음)이 아니라 일반적인 인터페이스입니다.