2010-11-06 2 views
1

Эй, я пытаюсь реализовать алгоритм ShellSort и теперь у меня проблема:Неконтролируемой проблема литой

warning: [unchecked] unchecked cast
found : java.util.Vector
required: java.util.Vector<java.lang.Object>
Vector<Object> vcur = (Vector<Object>)currentCols[tcur];
То же самое с vtmp.

Я не знаю, где проблема. Было бы здорово, если бы вы могли мне помочь. :)
Это мой код:

public static Vector<Object> shellSort(Vector<Object> ul) { 
    int lcount = ul.size(); 
    int colcount = 4; // 2^x 
    Vector[] currentCols = { ul }; 
    for(; colcount > 0; colcount = (colcount/2)) { 
     Vector[] tmpCols = new Vector[colcount]; 
     for(int t1 = 0; t1 < colcount; t1++) { 
      tmpCols[t1] = new Vector<Object>(); 
     } 
     int tcur = 0; 
     int tcurlvl = 0; 
     int ttmp = 0; 
     for(int t2 = 0; t2 < lcount; t2++) { 
      Vector<Object> vcur = (Vector<Object>)currentCols[tcur]; 
      Vector<Object> vtmp = (Vector<Object>)tmpCols[ttmp]; 
      vtmp.addElement((Object)vcur.elementAt(tcurlvl)); 

      // step to next place 
      tcur++; 
      ttmp++; 
      if(tcur == currentCols.length) { tcur = 0; tcurlvl++; } 
      if(ttmp == tmpCols.length) { ttmp = 0; } 
     } 
    } 
    return ul; 
} 

ответ

1

Это еще не решит проблему (код не работает ... никогда не сортируется), но он обновляется, чтобы использовать List вместо Vector (вектор устарел, не может быть устаревшим, поскольку официальные API зависят от него) , Если вам не нужна синхронизация, встроенная в Vector use List/ArrayList.

Я также изменил создание массива, чтобы быть ближе к родовому (не может действительно создать генерическое создание массива).

Наконец, я сделал весь метод общим, чтобы он мог работать с вещами, отличными от Object (поэтому List или List и т. Д.).

Он все еще дает предупреждения. Возможно, вам следует работать над тем, чтобы код работал правильно, прежде чем беспокоиться об этом конкретном предупреждении (обычно я бы не предлагал этого, но с помощью дженериков, которые иногда могут быть лучшим способом сделать это).

public static <T> List<T> shellSort(List<T> ul) 
{ 
    int lcount = ul.size(); 
    int colcount = 4; // 2^x 

    List<T>[] currentCols = (List<T>[])Array.newInstance(List.class, 1); 
    currentCols[0] = ul; 

    for(; colcount > 0; colcount = (colcount/2)) 
    { 
     List<T>[] tmpCols = (List<T>[])Array.newInstance(List.class, colcount); 

     for(int t1 = 0; t1 < colcount; t1++) 
     { 
      tmpCols[t1] = new ArrayList<T>(); 
     } 

     int tcur = 0; 
     int tcurlvl = 0; 
     int ttmp = 0; 

     for(int t2 = 0; t2 < lcount; t2++) 
     { 
      List<T> vcur = currentCols[tcur]; 
      List<T> vtmp = tmpCols[ttmp]; 
      vtmp.add(vcur.get(tcurlvl)); 

      // step to next place 
      tcur++; 
      ttmp++; 
      if(tcur == currentCols.length) { tcur = 0; tcurlvl++; } 
      if(ttmp == tmpCols.length) { ttmp = 0; } 
     } 
    } 

    return ul; 
} 
+0

После попытки вашего кода и фиксируя его немного там снова предупреждение: [снят] сняты литая найдено: java.lang.Object требуется: java.util.List [] Список [] tmpCols = (Список []) Array.newInstance (List.class, colcount); – papr

+0

Yup. Невозможно удалить жалобу (что я знаю), но этот код ближе к тому, что вам нужно (даже если вы просто возьмете код Array.newInstance). Как правило, предупреждение о компиляторе - это плохо, в этом случае, поскольку вокруг нет пути, вам просто нужно принять его. – TofuBeer

1

Я считаю, что проблема здесь тип стирания. Во время выполнения Вектор является просто вектором. Например:

Vector<String> stuff = new Vector<String>() 
Vector<Object> objects = (Vector<Object>)stuff 

Он будет скомпилирован, но сбой во время выполнения, когда вы попытаетесь поместить объект Int в объекты.

+0

Java не позволяет вам делать это, последний раз, когда я проверил - именно по той причине, что вы дали. – cHao

+0

Видимо, это позволяет ему броситься так, но давая ему безответное предупреждение? – Collin

+0

Скорее всего предупреждение о 'Vector []' объявлениях в коде. 'Vector []' и 'Vector []' могут выглядеть одинаково в байт-коде, но они не совсем то же самое с компилятором. – cHao

0

Почему вы объявляете currentCols?

Vector[] currentCols = { ul }; 

Этот массив всегда содержит один элемент - ul. Просто замените currentCols[..] на ul, и ошибка также исчезнет.

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