首页 > 解决方案 > 如何修复 Java 中的“不兼容的类型:SomeObject 无法转换为 CAP#1”错误

问题描述

我正在尝试制作一个游戏,为了不编写相同的方法和函数,我在 Java 中使用协方差和通配符,以便以后能够重用于其他类型(类似)游戏的代码。我目前的问题是我无法将 Piece 添加到我的 ArrayList 中。

我怎样才能做到这一点 ?

这是我当前在 Linux 上的 Java 版本。openjdk 版本 "10.0.2" 2018-07-17 OpenJDK 运行时环境 (build 10.0.2+13-Ubuntu-1ubuntu0.18.04.4) OpenJDK 64-Bit Server VM (build 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;
      }
    }

多米诺骨牌类:

    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

我想要实现的是能够将我的 Dominos 正常添加到 ArrayList。并且可能稍后在其他类型的游戏中!

谢谢

标签: javaoopsubclasscovariancesubclassing

解决方案


你看到这个其他的答案了吗?

更改? extends PiecePiece至少为我编译:

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+" ");
    }
  }
}

推荐阅读