2015-06-02 2 views
2

В настоящее время я читаю урок на Java, и этот урок охватывает передачу объекта ArrayList с помощью статического метода. В первом статическом методе вы видите, что ArrayList нужно было объявить только как ArrayList и имя для него. Первый статический метод отображает все элементы в массиве. Второй статический метод изменяет элементы ArrayList. При объявлении ArrayList в этом методе он должен быть объявлен как ArrayList<Integer> для целей модификации. Почему это так, и почему это имеет значение? Спасибо всем, кто хочет пролить свет на это.Почему мы должны использовать Список определенного типа в Java

import java.util.ArrayList; 

public class Chap11Part5 
{ 
    public static void main(String[] args) 
    { 

     ArrayList<Integer> numbers = new ArrayList<Integer>(); 

     //For-Loop to create elements for the ArrayList 
     for (int i = 1; i < 11; ++i) 
      numbers.add(i); 

     display(numbers); //Display Elements 
     change(numbers, 5); //Change Elements (See "change" method) 
     display(numbers); //Display New Results 


    } 

    //Loop to display elements of ArrayList 
    static void display(ArrayList arr) { 
     for(int i = 0; i < arr.size(); ++i) 
      System.out.print(arr.get(i) + " "); 
     System.out.println(); 
    } 
    //Loop to change elements of ArrayList 
    static void change(ArrayList<Integer> arr, int amount) { 
     int value; 
     for(int i = 0; i < arr.size(); ++i) { 
      value = arr.get(i); 
      arr.set(i, value + amount); 
     } 
    } 

} 
+0

Хотелось бы знать, почему это отображается как ArrayList . Я не понимаю, почему это не соответствует правильному пути моего вопроса. Я извиняюсь. –

+0

Этот код использует исходный тип, и он не должен. Прочитайте http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use-it –

+0

Спасибо @JBNizet –

ответ

3

Синтаксис <> называется generics - это позволяет ограничить какой тип элементов проводит сбор, и обращаться к ним по этому типу. Это не требуется, это просто более удобно.

Например, вы могли бы написать второй метод без каких-либо обобщений указанных, но вы должны обрабатывать отвержение себя:

static void change(ArrayList arr, int amount) { 
    int value; 
    for(int i = 0; i < arr.size(); ++i) { 
     value = (Integer) arr.get(i); // explicit casting here. Yuck! 
     arr.set(i, value + amount); 
    } 
} 
+0

Итак, если я понимаю вас, я никогда должен был использовать «ArrayList » при объявлении внутри метода. Я до сих пор не совсем понимаю, требуется ли вообще (Integer) вообще. Может ли строка быть написана как «value = arr.get (i);» или должно быть объявлено целое число внутри метода? –

+0

Вам нужно, чтобы приведение к 'Integer', поэтому значение можно распаковать в' int', поскольку 'значение' определено. Если вам не нужно выполнять математические операции над ним, вы определенно могли бы использовать 'Object value = arr.get (i)'. – Mureinik

+0

@JeffSours вы никогда не должны использовать необработанные типы. Используйте 'ArrayList ' или 'ArrayList ', но не 'ArrayList'. Прочитайте ссылку, которую я опубликовал в качестве комментария к вашему вопросу. –

0

Это пример Java Generics API. Если вы объявляете как тип, то коллекция будет принимать только этот тип элементов.

Это решает проблему обработки проблемы ClassCastException, где мы использовали для обработки кастинга явно.

value = (Integer) arr.get(i); 
0

Создание в List для определенного типа (то есть ArrayList<Integer> ваше упоминание) удалит риск ClassCastException во время выполнения.

Смежные вопросы