реализующий интерфейс - PullRequest
1 голос
/ 15 мая 2010

Привет, ребята, так что у меня есть это задание, мне нужно реализовать интерфейс, чтобы просмотреть ArrayList и отсортировать его (по возрастанию или по убыванию). Мне не нужен "ответ", мне просто нужны некоторые предложения относительно моего подхода и почему я получаю это ошибка

Exception in thread "main" java.lang.ClassCastException: Week7.Check cannot be cast to java.lang.Comparable
 at java.util.Arrays.mergeSort(Unknown Source)
 at java.util.Arrays.sort(Unknown Source)
 at java.util.Collections.sort(Unknown Source)
 at Week7.TestCheck.main(TestCheck.java:18)

Вот как я это сделал:

сопоставимый имел один метод под названием public int compairTo(Object o):

public class Check implements comparable {
    private Integer checkNumber;

    public Check(Integer newCheckNumber) {
        setCheckNumber(newCheckNumber);
    }

    public String toString() {
        return getCheckNumber().toString();
    }

    public void setCheckNumber(Integer checkNumber) {
        this.checkNumber = checkNumber;
    }

    public Integer getCheckNumber() {
        return checkNumber;
    }

    @Override
    public int compairTo(Object o) {
        Check compair = (Check) o;
        int result = 0;
        if (this.getCheckNumber() > compair.getCheckNumber())
            result = 1;

        else if (this.getCheckNumber() < compair.getCheckNumber())
            result = -1;

        return result;
    }
}

у меня в основном это было

import java.util.ArrayList;
import java.util.Collections;

public class TestCheck {
    public static void main(String[] args) {
        ArrayList checkList = new ArrayList();

        checkList.add(new Check(445));
        checkList.add(new Check(101));
        checkList.add(new Check(110));
        checkList.add(new Check(553));
        checkList.add(new Check(123));

        Collections.sort(checkList);

        for (int i = 0; i < checkList.size(); i++) {
            System.out.println(checkList.get(i));
        }
    }
}

Ответы [ 6 ]

7 голосов
/ 15 мая 2010

C'mon - в Java учитывается регистр. «сопоставимый» - не то же самое, что «сопоставимый»

public class Check implements comparable

Правописание также имеет значение. «compairTo» - это не тот же метод, что и «CompareTo»

@Override
public int compairTo(Object o) {
2 голосов
/ 15 мая 2010

Я полагаю, что интерфейс сопоставимый , который вы реализуете, не является интерфейсом java.lang.Comparable , их имя может совпадать, но пакет?

1 голос
/ 16 мая 2010

Чтобы использовать Comparator (то, что вы вызываете с двумя аргументами), вы должны передать его в качестве параметра методу Collections.sort.

Как это:

Collections.sort( checkList, new Comparator<Check>() {
    public int compare( Check one, Check two ) {
        return one.getCheckNumber() - two.getCheckNumber();
    }
 });

Вот как это будет выглядеть:

import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;

public class Check   {
    private final Integer checkNumber;

    public Check(Integer newCheckNumber) {
        this.checkNumber = newCheckNumber;
    }
    public Integer getCheckNumber() {
        return this.checkNumber;
    }
    public static void main( String [] args ) {
        List<Check> list = new ArrayList<Check>();

        list.add(new Check(445));
        list.add(new Check(101));
        list.add(new Check(110));
        list.add(new Check(553));
        list.add(new Check(123));

        Collections.sort( list, new Comparator<Check>() {
           public int compare( Check one, Check two ){
               return one.getCheckNumber() - two.getCheckNumber();
           } 
        });
        for( Check item : list ) {
            System.out.println( item.getCheckNumber() );
        }
    }
}
0 голосов
/ 15 мая 2010

[... И] почему я получаю эту ошибку

При звонке:

Collections.sort(checkList);

В строке 18 метод ожидает, что ваши элементы реализуют Comparable (чтобы можно было их сравнивать). Возможно, вы этого не знаете, но так оно и работает (как указано в документации ).

Все элементы в списке должны реализовывать интерфейс Comparable

Затем метод запускается, он пытается «привести» ваши объекты к типу Comparable, поскольку ваш класс не реализует его, он выдает ClassCastException

Чтобы лучше понять это, попробуйте следующий код:

class Some {
}
class Test {
    public static void main( String [] args ) {
         Runnable r = ( Runnable ) new Some();
    }
}

Если вы анализируете строку, вы можете подумать «Почему вы пытаетесь присвоить Runnable некоторым? Они не связаны!»

И вы правы, давайте посмотрим на вывод:

$ java Test
Exception in thread "main" java.lang.ClassCastException: Some cannot be cast to java.lang.Runnable
        at Test.main(A.java:5)

То же сообщение об ошибке. Вы можете взглянуть на строку 5 и посмотреть актерский состав.

Это именно то, что происходит в методе Collections.sort, но с Comparable

0 голосов
/ 15 мая 2010

Все, что вы передаете Arrays.sort(), должно реализовывать Comparable, который является интерфейсом системы Java. Вы, вероятно, хотите выбросить comparable.

0 голосов
/ 15 мая 2010

при реализации интерфейса вы должны использовать метод подписи предоставленный интерфейс, точно так, как это определено в интерфейсе:

public int compareTo(Object o) 

Кроме того, вы могли бы параметризовать список, например. List<Comparable>, и Сопоставимые например. Comparable<Check> как использование генерик является методом во время компиляции, которые бы определили ваши опечатки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...