【问题标题】:Cannot convert from String to (what should be another String)无法从字符串转换为(应该是另一个字符串)
【发布时间】:2013-03-12 12:08:55
【问题描述】:

我正在尝试使用枚举来存储一堆字符串,但是当我将它们转换为字符串时它不起作用。我收到错误消息“无法从 String 转换为 ChessSquare.SelectedPiece。我认为这只是一点点变化,但我找不到要更改的内容。

这是我的代码:

package Logic;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;


    //chess square class, 1 instance of which for each square in the grid
    @SuppressWarnings("serial")
    public class ChessSquare extends JButton {

        //instance variables for position and pieces
        public int posX;
        public int posY;
        public String currentPiece;
        public enum selectedPiece{
            NONE, PAWN, ROOK, KNIGHT, BISHOP, QUEEN, KING
        }
        selectedPiece piece;

        //load images and cast into icons
        BufferedImage buttonIcon = ImageIO.read(new File(piece));
            ImageIcon Icon = new ImageIcon(buttonIcon);
                BufferedImage 

        //constructor for chess squares
        public ChessSquare(int x, int y, double p) throws IOException {
            this.setIcon(Icon);
                setVisible(true);
            }

        //accessor method for position
        public void squarePos(int x, int y){
            this.posX = x;
            this.posY = y;
        }

        //accessor method for currentPiece
        public void cPiece(){
            this.currentPiece = piece;
        }

        //specify what each value of enum slectedPiece represents
        public void selectedPiece(){
            switch (piece){
                case NONE:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
                case PAWN:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg";
                case ROOK:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Rook.jpg";
                case KNIGHT:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Knight.jpg";
                case BISHOP:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Bishop.jpg";
                case QUEEN:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\Queen.jpg";
                case KING:
                        piece = "E:\\Eclipse\\ChessF\\src\\Images\\King.jpg";
            }
        }
    }

【问题讨论】:

  • enum != String。你不能像那样交换类型。
  • 我无法编译你的代码:ImageIcon Icon = new ImageIcon(buttonIcon); BufferedImage
  • 没有回答你的问题,但你真的应该把 break;和默认值:在您的开关盒中。那会让你免于地狱。
  • 问题出在您的 cPiece 方法中。您的 cPiece 方法到底应该做什么?
  • 仅供参考,您可以使用 / 作为目录分隔符。在 Windows 上,JVM 会将其转换为 \。

标签: java string enums


【解决方案1】:

在 Java 中,枚举是一个成熟的类...因此,您应该将枚举操作(转换为字符串/从字符串转换为字符串)放入其中。例如:

    public enum SelectedPiece{
        NONE("E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg"), 
        PAWN("E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg"), 
        ROOK("E:\\Eclipse\\ChessF\\src\\Images\\Rook.jpg"), 
        KNIGHT("E:\\Eclipse\\ChessF\\src\\Images\\Knight.jpg"), 
        BISHOP("E:\\Eclipse\\ChessF\\src\\Images\\Bishop.jpg"), 
        QUEEN("E:\\Eclipse\\ChessF\\src\\Images\\Queen.jpg"), 
        KING("E:\\Eclipse\\ChessF\\src\\Images\\King.jpg");

        private String imageFilename;
        private ImageIcon image;

        private SelectedPiece( String imageFilename ) throws IOException {
            this.imageFilename = imageFilename;
            this.image = new ImageIcon(ImageIO.read(new File(piece)));
        }

        public String getImageFilename() {
            return imageFilename;
        }

        public ImageIcon getImage() {
            return image;
        }
    }

等等...然后在需要的地方使用枚举值。

【讨论】:

  • imageFilenameimage 应该是最终的
  • @SteveKuo,并不是说他们不应该这样做,但这有什么帮助? (好奇,没有挑战性……)
【解决方案2】:

枚举不是字符串。要在它们之间进行转换,您需要使用 valueOf

例如,

selectedPiece.valueOf("ROOK");

将返回枚举 selectedPiece.ROOK

在编写枚举时,可以使用自定义值,例如,

Public enum Piece {
  ROOK("Rook"),
  QUEEN("Queen")
}

【讨论】:

    【解决方案3】:

    当您执行this.currentPiece = piece; 时,您正在尝试在 String 对象中分配枚举类型。这是不可能的。

    【讨论】:

      【解决方案4】:

      piece 的类型为 selectedPiece(您的枚举)

      你不能给它分配一个字符串。将路径存储在另一个变量中。

      例如:

      String piecePath;
      switch (piece){
                          case NONE:
                                  piecePath = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
       ...
      

      【讨论】:

        【解决方案5】:

        您应该使用枚举作为类中的变量来确定其类型。您可以简单地添加:

            public selectedPiece pieceType;
        

        然后在对象的某处设置类型:

            pieceType = selectedPiece.ROOK;
        

        然后你可以使用枚举做switch语句将字符串分配给字符串变量。

        您的组织方式取决于您。

        【讨论】:

          【解决方案6】:

          也许这是使用 CONSTANTS 的一种情况?毕竟,如果 pawn 的图形图像总是相同的图像,那不是让它保持不变吗?

          static final string IMAGE_NONE = "E:\\Eclipse\\ChessF\\src\\Images\\EmptySquare.jpg";
          static final string IMAGE_PAWN = "E:\\Eclipse\\ChessF\\src\\Images\\Pawn.jpg";
          

          在你的案例陈述中

          case PAWN:
            piece = IMAGE_PAWN 
          

          等等等等

          【讨论】:

          • Java 没有var
          • 我把它改成了静态的最终字符串,谢谢你指出我的错误。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-19
          • 1970-01-01
          • 2019-05-11
          相关资源
          最近更新 更多