2011-04-07 50 views
2

我有一个使用可枚举数据类型的类。在它的构造函数中,它使用了其中的两个。当我尝试从另一个文件实例化此类的对象时,出现错误。
这里是从类的部分代码:当构造函数期望枚举时,如何实例化对象?

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.的帖子和公认的答案。

+2

“enumerable”!=“enumeration”。 Java中很少使用“enumerable”这个词,但它通常用于表示“可迭代”之类的东西。 – 2011-04-07 05:25:54

回答

2

作为枚举在类中声明,是内型因此必须有资格使用外部类:

Card C1 = new Card(Card.rankType.ACE, Card.suitType.SPADE); 

可能是更好的,如果你在独立的类,从而可以参考定义枚举(该型)直接使用静态导入像import static RankType.*你可以使用:

Card C1 = new Card(ACE, SPADE); 

而且从构造函数中删除void的规定。

+0

就是这样。感谢大家。太糟糕了,你不能在这里接受多个答案。这个包含两个问题的解决方案,所以它得到了这个魔术复选标记。如果有一个看不见的复选标记,可以去@uthomas和@Tieson T. – user663467 2011-04-07 05:41:05

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); 

编辑:您还需要从构造函数中删除无效的,因为@uthomas指出。构造函数返回它们被定义的对象的类型。这就是为什么他们必须与班级本身具有相同的名称。

+0

'卡片C1 =新卡片(rankType.ACE,suitType.SPADE);'提供与以前相同的错误,并附加一个。对于这两种类型,我都会得到一个'找不到符号'的错误。至于枚举的情况,这些名字是作业的一部分,所以我不想改变它们。有什么我需要做的,以便让Java知道该怎么做这个类。在C++中#include“Card.h”;将需要。在java中有类似的东西吗? – user663467 2011-04-07 05:28:32

+0

您是否删除了空白?当我在Eclipse中创建一个测试项目时,您的代码无错地工作。 – 2011-04-07 05:35:10

+0

我不得不在最后添加一个缺少的大括号。我以为你只是没有错误地复制它。如果没有,在构造函数之后添加一个花括号,并且应该是GTG。 – 2011-04-07 05:36:48

4

尝试从构造函数中删除void关键字。

+0

解决了一半的问题。可耻的是,我没有看到我自己... – 2011-04-07 05:27:50

+0

部分成功。现在只是'找不到符号'错误的问题。那里有任何想法? – user663467 2011-04-07 05:30:46

+0

@Tieson T:不用担心;) – uthomas 2011-04-07 05:34:10

2

当删除voiduthomas写道,您需要使用正确的枚举。 rankTypesuitTypeCard内部类,所以如果你想从类外使用它们,您需要通过外部类名称的前缀他们:

Card C1 = new Card(Card.rankType.ACE,Card.suitType.SPADE) 

由于枚举是一个类,按照惯例和将其命名为以大写字母开头。

+0

我向主人鞠躬。我习惯了我们的Java教授如何使用这个特定的任务。他让他们为每个枚举和每个类使用单独的文件,所以我错误地认为他们也是这样做的。 :p – 2011-04-07 05:41:22

相关问题