2010-03-14 5 views
13

W .NET zarówno tablica, jak i lista mają Enumerable jako element nadrzędny, więc metoda, która akceptuje Enumerable jako argument, może otrzymać zarówno tablicę, jak i listę jako jej argument. Zastanawiam się, czy jest coś podobnego w Javie?Wspólny przodek do tablicy Javy i listy

Odpowiedz

20

Nie, nie ma odpowiednika w języku Java. Generalnie sugerowałbym zaprojektowanie metod API do otrzymywania List<T>, Collection<T> lub Iterable<T>. Chociaż wykluczają one metodę z tablicą, można bardzo łatwo owijać tablicę, używając Arrays.asList. Jest to bardziej elastyczne dla osoby dzwoniącej niż określanie tablicy jako parametru metody, która wymusza pojedynczą implementację.

Zgadzam się, że nie jest to idealne rozwiązanie.

Należy pamiętać, że w .NET jednowymiarowe tablice nie tylko implementują IEnumerable<T> - implementują także IList<T>.

1

Obie pochodzą z java.lang.Object. Jednak nie jest to związane z kolekcją, ale myślę, że tego właśnie szukasz.

3

Tablica i lista w Javie nie mają wspólnego przodka innego niż java.lang.Object.

Zarówno można uzyskać za pomocą pętli foreach, tak:

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

Moje języki są zdezorientowane - ostatnio czytałem C#. – duffymo

4

Oni nie mają wspólnego przodka, jednak istnieją sposoby na rzucenie pomiędzy tymi dwoma typami, ile potrzeba -

Więc można zapewnić przeciążony metoda odlewania na typ zwykły - tj.

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

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

Zasadniczo tablice mają niejawny typ będący podklasą obiektu. Zobacz Arrays w 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 

Sposób macierze i listy są obsługiwane również nie jest to samo, gdy weźmiemy pod uwagę covariance/contravariance.

List<Object> l = new ArrayList<String>(); // complain 
Object[] l2 = new String[1]; // ok 

l2[0] = 4; // throw ArrayStoreException. 

Jeszcze gorzej, jeśli weźmiemy pod uwagę leki generyczne, ale to już inny temat. Podsumowując, nie znam racjonalności tego projektu, ale musimy z tym żyć.

1

Iterable<T> to odpowiednik Javy w wersji IEnumerable<T>. Wszystkie/większość kolekcji implementuje ten interfejs (w tym ArrayList i tablice), więc tak. Ale to nie jest "przodek" (którego nie ma w .NET), ale wspólny interfejs.

Powiązane problemy