Как исправить 'несовместимые типы: SomeObject не может быть преобразован в CAP # 1' ошибка в Java - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь сделать игру, чтобы не писать те же методы и функции, я использую ковариацию и подстановочные знаки в Java, чтобы иметь возможность повторно использовать ее для последующего написания кода для других (похожих) игр,Моя текущая проблема заключается в том, что я не могу добавить Piece в мой ArrayList.

Как я могу это сделать?

Вот моя текущая версия Java для Linux.Версия openjdk "10.0.2" 2018-07-17 Среда выполнения OpenJDK (сборка 10.0.2 + 13-Ubuntu-1ubuntu0.18.04.4) Виртуальная 64-битная серверная OpenJDK (сборка 10.0.2 + 13-Ubuntu-1ubuntu0.18.04.4, смешанный режим)

Я перепробовал много мелочей, ничего неопровержимого.Может быть, я должен попытаться разыграть Домино?

Это те классы, которые у меня сейчас есть:

Колода классов:

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

    public class Deck {

      private List<? extends Piece> deck;
      private int taille;

      public Deck(){
        this.deck = new ArrayList<Domino>();

        for (int i = 0; i < 7; i++){
          for (int j = i; j < 7; j++){
            Domino d = new Domino(i,j);
            deck.add(d);
          }
        }

        this.taille = deck.size();
      }

      public List<? extends Piece> getDeck(){
        return this.deck;
      }

      public int tailleActuelle(){
        return this.deck.size();
      }

      public int tailleDepart(){
        return this.taille;
      }

      public void melangeDeck(){
        Collections.shuffle(deck);
      }

      public String toString(){
        return "Deck de Dominos : \nTaille de départ : "+this.tailleDepart()+
               "\nTaille actuelle : "+this.tailleActuelle();
      }

      public void printDominosDeck(){
        for (Domino d : deck){
          System.out.print(d+" ");
        }
      }
    }

Кусок класса:

    public class Piece {
      private boolean revele;

      public Piece(){
        this.revele = false;
      }

      public boolean estRevele(){
        return this.revele;
      }

      public void pieceRevele(){
        if (!this.revele) this.revele = !this.revele;
      }
    }

Класс Domino:

    public class Domino extends Piece  {
    //implements Comparable<Domino>

      private int faceD, faceG;

      public Domino(){
        super();
        this.faceD = 0;
        this.faceG = 0;
      }

      public Domino(int d, int g){
        super();
        this.faceD = d;
        this.faceG = g;
      }

      public int getValeurDroite(){
        return this.faceD;
      }

      public int getValeurGauche(){
        return this.faceG;
      }

      public int sommeDesFaces(){
        return this.faceD+this.faceG;
      }

      public String toString(){
        return "["+this.faceD+" | "+this.faceG+"]";
      }
    }

На данный момент у меня есть следующие ошибки:

    Deck.java:17: error: incompatible types: Domino cannot be converted to CAP#1
            deck.add(d);
                     ^
      where CAP#1 is a fresh type-variable:
        CAP#1 extends Piece from capture of ? extends Piece
    Deck.java:46: error: incompatible types: CAP#1 cannot be converted to Domino
        for (Domino d : deck){
                        ^
      where CAP#1 is a fresh type-variable:
        CAP#1 extends Piece from capture of ? extends Piece
    Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
    2 errors

Я пытаюсь добиться того, чтобы иметь возможность нормально добавлять своих Домино вArrayList.И возможно позже на других типах игровых фигур!

Спасибо

1 Ответ

0 голосов
/ 27 декабря 2018

Вы видели этот другой SO ответ ?

Изменение ? extends Piece на Piece, по крайней мере, компилируется для меня:

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

public class Deck {

  private List<Piece> deck = new ArrayList<Piece>();
  private int taille;

  public Deck(){
    this.deck = new ArrayList<Piece>();

    for (int i = 0; i < 7; i++){
      for (int j = i; j < 7; j++){
        Domino d = new Domino(i,j);
        deck.add(d);
      }
    }

    this.taille = deck.size();
  }

  public List<? extends Piece> getDeck(){
    return this.deck;
  }

  public int tailleActuelle(){
    return this.deck.size();
  }

  public int tailleDepart(){
    return this.taille;
  }

  public void melangeDeck(){
    Collections.shuffle(deck);
  }

  public String toString(){
    return "Deck de Dominos : \nTaille de départ : "+this.tailleDepart()+
           "\nTaille actuelle : "+this.tailleActuelle();
  }

  public void printDominosDeck(){
    for (Piece d : deck){
      System.out.print(d+" ");
    }
  }
}
...