Непроверенные предупреждения для Arraylist - PullRequest
5 голосов
/ 28 февраля 2011

Почему я получаю эти 4 предупреждения от -Xlint и что мне с ними делать? Я только начинаю на Java, поэтому, вероятно, упускаю что-то очевидное.

import java.util.*;

class CompareGerbils implements Comparator {
    public int compare(Object o1, Object o2) {
       return ((Gerbil)o2).number() - ((Gerbil)o1).number();
    }
}

class Gerbil {
int gerbilNumber;

Gerbil(int gN) {
    gerbilNumber = gN;
    }

int number() {
    return gerbilNumber;
    }
}

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

    // I'd like to be able to add both ints and strings to list
    ArrayList list = new ArrayList();

    //unchecked call warning:
    list.add(1);  

    //unchecked call warning:
    list.add("b");  

    ArrayList<Gerbil> gerbillist = new ArrayList<Gerbil>();

    for(int i = 0; i < 5; i++) {
        gerbillist.add(new Gerbil(i));
    }

    //unchecked conversion warning
    //unchecked method invocation
    Collections.sort(gerbillist, new CompareGerbils());
  }
}

РЕДАКТИРОВАТЬ: ответы до сих пор ответили на декларацию Arraylist. Как насчет сортировки предупреждений в нижней части кода? спасибо

Ответы [ 4 ]

7 голосов
/ 28 февраля 2011

Вы получаете это, потому что вы не определили тип данных для ArrayList list. Единственный способ добавить как строки, так и целые числа в list без получения предупреждений, это определить его как ArrayList<Object> list - что здесь происходит неявно (строка list.add(1); неявно преобразует 1 в new Integer(1) - это называется Autoboxing). Также обратите внимание, что если вы хотите, чтобы в lists были и строки, и целые числа, метод сортировки на самом деле не имеет смысла - как вы ожидаете, что вещи будут отсортированы по алфавиту или по цифрам?

Редактировать: Кроме того, не считается хорошей практикой объявлять конкретный тип (т.е. ArrayList<Object> list), если у вас нет для этого веских причин. Рекомендуется инициализировать с использованием интерфейса, т.е. List<Object> list.

Итак, ваш код должен быть таким (обратите внимание на часть Comparator<Gerbil>, которая исправляет предупреждение в Collections.sort):

// I'd like to be able to add both ints and strings to list
List<Object> list = new ArrayList<Object>();

list.add(new Integer(1));  

list.add(new String("b"));  

List<Gerbil> gerbillist = new ArrayList<Gerbil>();

for(int i = 0; i < 5; i++) {
    gerbillist.add(new Gerbil(i));
}

Collections.sort(gerbillist, new Comparator<Gerbil>() {
    public int compare(Gerbil o1, Gerbil o2) {
        int diff = o1.getNumber() - o2.getNumber();
        if (diff > 0)
           return 1;
        else if (diff <0)
           return -1;
        else
           return 0;
    }
});

Что касается класса Gerbil, я предлагаю вам использовать форму getNumber в качестве имени метода, а не number - это де-факто стандарт для имен методов, чтобы получить значение переменной-члена (и, соответственно, setNumber(int value) для настройки):

class Gerbil {
int gerbilNumber;

Gerbil(int gN) {
    gerbilNumber = gN;
    }

int getNumber() {
    return gerbilNumber;
    }
}
3 голосов
/ 28 февраля 2011

Предупреждение появляется, когда вы используете неуниверсальный тип в контексте, где ожидается универсальный тип.Компиляция говорит, что вы можете быть правы, но я не могу проверить тип для вас.

Вы также не можете;

  • Сделайте тип правильным универсальным.
  • Отключите предупреждение с помощью @ SuppressWarnings
  • Игнорируйте предупреждение.

РЕДАКТИРОВАТЬ: В этом примере вы должны выбрать суперкласс / интерфейс элементов в списке.

// I'd like to be able to add both ints and strings to list
List<Object> list = new ArrayList<Object>();

list.add(1);  
list.add("b");  

Вместо объекта вы можете выбрать Seralizable или Comparable, однако любой из них, вероятно, будет полезен.Действительно, List<Object> редко полезен, за исключением упражнений.

Правильный способ реализации Comparator - использовать сравнение.Использование - допустимо только в том случае, если вы знаете, что это невозможно.например, 2000000000 - -2000000000 <0, тогда как вы можете ожидать 2000000000 - -2000000000> 0

class CompareGerbils implements Comparator<Gerbil> {
    public int compare(Gerbil a, Gerbil b) {
       return a.number() > b.number() ? +1 
            : a.number() < b.number() ? -1 : 0;
    }
}

В целях тестирования я предлагаю попробовать отсортировать список, который еще не отсортирован.Простой способ сделать это - использовать метод shuffle ().Это все еще можно отсортировать, но чем больше список, тем менее вероятно, что это так.

Collections.shuffle(gerbillis);
2 голосов
/ 28 февраля 2011
public static void main(String[] args) {
    final List<Object> list = new ArrayList<Object>();
    list.add(1);
    list.add("b");

    final List<Gerbil> gerbillist = new ArrayList<Gerbil>();
    for (int i = 0; i < 5; i++) {
        gerbillist.add(new Gerbil(i));
    }

   Collections.sort(gerbillist, new CompareGerbils());
}
1 голос
/ 28 февраля 2011
  1. вам нужно знать об обобщениях http://download.oracle.com/javase/1.5.0/docs/guide/language/generics.html

  2. вы пытаетесь добавить primitive и строку в arraylist. либо вы делаете это, чтобы взять что-нибудь

List<Object> list = new ArrayList<Object>();

или если вы хотите разрешить только строки

 List<String> list = new ArrayList<String>();  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...