2011-04-07 40 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

相關問題