Невозможно привести Comparable к классу, который его реализует. - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь создать генетический ArrayList для моей команды класса, но я не могу привести Comparable к T, несмотря на то, что T расширяет Comparable

(я пытался расширить Comparable без ввода , и та же проблемапроисходит)

public class ArrayList<T extends Comparable>
{
    static int MaxSize = 1003;//some random maximum size for our array lists
    public int Size = 0;
    public int Capacity = 0;
    T[] MyList;
    public ArrayList()//Default Constructor
    {
        this(MaxSize);
    }
    public ArrayList(int Capacity)
    {

        MyList = (T[]) new Comparable[Capacity]; // Casting
    }
}
public class Team implements Comparable<Team>
{
    public String Name;
    public int Points;
    public int GamesCount;
    public int Wins;
    public int Loses;
    public int GoalDifference;//Goals Scored - Goals Against
    public int GoalsScored;
    public int GoalsAgainst;
    public Team(String s)
    {
      Name = s;
      Points = 0;
      GamesCount = 0;
      Wins = Loses = 0;
      GoalDifference = GoalsAgainst = GoalsScored = 0;
    }
}
public class Test
{
 public static void main(String args[])
  {
     ArrayList<Team> Teams = new ArrayList<Team>(10);
            for(int i = 0 ;i < 10;i++)
            {
                String TeamName = in.next();
                Teams.MyList[i] = new Team(TeamName);//exception here
            }
  }
}

Я получаю следующее исключение.Заранее большое спасибо за вашу помощь.

Исключение в теме "main" java.lang.ClassCastException: [Ljava.lang.Comparable;нельзя привести к [LTeam;at Test.main (Test.java:21)

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

В вашем коде T равно Team.

Team IS-A Comparable.Следовательно, вы можете разыграть Team до Comparable.

Но каждый Comparable не является Team.Следовательно, Comparable нельзя преобразовать в Team.

0 голосов
/ 16 февраля 2019

посмотрите это утверждение: MyList = (T[]) new Comparable[Capacity]; он инициализирует массив из интерфейса Comparable и помещает его в поле MyList с типом Team[].вы можете проверить его с помощью:

{
    MyList = (T[]) new Comparable[Capacity]; // Casting
    System.out.println( MyList.getClass().toString());
}

он записывает class [Ljava.lang.Comparable; в выводе ... так что при первой попытке доступа к этому полю извне класса вы получите ClassCastException, даже вызвав длину в тестовом методе, какэто:

public class Test
{
    public static void main(String args[])
    {
        MArrayList<Team> Teams = new MArrayList<Team>(10);
        int length = Teams.MyList.length; // this line throws ClassCastException 
        ....
    }
}

Чтобы решить вашу проблему, я предлагаю изменить ваш класс ArrayList следующим образом:

public class ArrayList<T extends Comparable<T>>
{
    ...
    Comparable<T>[] MyList;
    ...
    public ArrayList(int Capacity)
    {
        MyList = new Comparable[Capacity]; // Casting
    }
}
0 голосов
/ 16 февраля 2019

Это очевидно, просто подумайте об этом на секунду.

new Comparable[Capacity];

Здесь вы создаете array, который будет содержать Comparable элементов.
Затем вы пытаетесь downcast до array из Team, что означает попытку использовать более конкретный тип и что недопустимо ( Upcasting и downcasting в Java ), и, как вы видите, выдает ClassCastException.

Поскольку ваш array будет содержать только типы, которые extends Comparable, вы можете иметь Comparable array внутри вашей реализации ArrayList.

Comparable[] MyList;

Затем вы можете инициализировать его без приведения

MyList = new Comparable[Capacity];

И не забудьте реализовать метод Comparable#compareTo в вашем классе Team, иначе код не скомпилируется.


Вы просили привести пример.

public class ArrayList<T extends Comparable> {
    private static final int MAX_SIZE = 1000;
    private final Comparable<T>[] list;

    public ArrayList() {
        this(MAX_SIZE);
    }

    public ArrayList(int capacity) {
        list = new Comparable[capacity]; // Casting
    }

    public T get(final int index) {
        return (T) list[index];
    }

    public void set(final int index, final T value) {
        list[index] = value;
    }
}

Использование довольно просто

final ArrayList<Team> teamArrayList = new ArrayList<>(3);
teamArrayList.set(0, new Team("One"));
teamArrayList.set(1, new Team("Two"));
teamArrayList.set(2, new Team("Three"));

final String name = teamArrayList.get(0).Name;

Поскольку вы расширили интерфейс Comparable<T>, вам нужно реализовать его

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

Базовый пример:

@Override
public int compareTo(final Team other) {
    return name.compareTo(other.name);
}
...