我有一个使用可枚举数据类型的类。在它的构造函数中,它使用了其中的两个。当我尝试从另一个文件中实例化该类的对象时,我收到错误 以下是该类代码的一部分:
public class Card {
public static enum colorType {BLACK, RED};
public static enum suitType {CLUB, DIAMOND, HEART, SPADE };
public static enum rankType {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT,
NINE, TEN, JACK, QUEEN, KING };
private boolean faceup = false;
private rankType rank;
private suitType suit;
//*************************************************************
//Card- constructor. initializes a card and makes it face down
//*************************************************************
public void Card(rankType r, suitType s){
this.rank = r;
this.suit = s;
this.faceup = false;
}
当我尝试这样做时:
Card C1 = new Card(ACE,SPADE);
从另一个文件,我收到一个错误。使用rankType.ACE和suitType.SPADE作为参数也会产生相同的错误。我可以做卡C1 =新卡();没有错误,但这将创建一个没有任何内容的卡。我得到的确切错误是:
internal error; cannot instantiate Card.<init> at Card to ()
显然在这种情况下使用可枚举有一些技巧。我做错了什么?
固定。我的问题的解决方案来自uthomas,Tieson T.和接受的答案。
答案 0 :(得分:4)
尝试从构造函数中删除void
关键字。
答案 1 :(得分:3)
您需要指定枚举的来源:
Card C1 = new Card(rankType.ACE, suitType.SPADE);
此外,您的枚举不应以小写字母开头。你也应该省略“类型”。所以这样做:
public static enum Color {BLACK, RED};
public static enum Suit {CLUB, DIAMOND, HEART, SPADE };
public static enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING };
然后对构造函数的调用变为:
Card C1 = new Card(Rank.ACE, Suit.SPADE);
编辑:您还需要从构造函数中删除void,正如@uthomas所说。构造函数返回定义它们的对象类型。这就是为什么它们必须与类本身具有相同的名称。
答案 2 :(得分:2)
当删除void
uthomas 时,您需要使用正确的枚举。 rankType
和suitType
是Card
的内部类,因此如果要在类外部使用它们,则需要使用外部类名称作为前缀:
Card C1 = new Card(Card.rankType.ACE,Card.suitType.SPADE)
由于枚举是一个类,请遵循约定并以大写字母开头命名。
答案 3 :(得分:2)
由于枚举是在类中声明的,因此是内部类型,因此您必须使用外部类进行限定:
Card C1 = new Card(Card.rankType.ACE, Card.suitType.SPADE);
如果您在单独的类中定义枚举可能会更好,因此可以直接引用(类型)并使用您可以使用的import static RankType.*
之类的静态导入:
Card C1 = new Card(ACE, SPADE);
同样从构造函数中删除void
。