Input 的定义:
//: enumerated/Input.java
package enumerated;
import java.util.*;
public enum Input {
NICKEL(5), DIME(10), QUARTER(25), DOLLAR(100),
TOOTHPASTE(200), CHIPS(75), SODA(100), SOAP(50),
ABORT_TRANSACTION {
public int amount() { // Disallow
throw new RuntimeException("ABORT.amount()");
}
},
STOP { // This must be the last instance.
public int amount() { // Disallow
throw new RuntimeException("SHUT_DOWN.amount()");
}
};
int value; // In cents
Input(int value) { this.value = value; }
Input() {}
int amount() { return value; }; // In cents
static Random rand = new Random(47);
public static Input randomSelection() {
// Don't include STOP:
return values()[rand.nextInt(values().length - 1)];
}
} ///:~
Category 的定义:
package chapter19;
import java.util.EnumMap;
//import net.mindview.util.*;
import static enumerated.Input.*;
//import static net.mindview.util.Print.*;
enum Category {
MONEY(NICKEL, DIME, QUARTER, DOLLAR),
ITEM_SELECTION(TOOTHPASTE, CHIPS, SODA, SOAP),
QUIT_TRANSACTION(ABORT_TRANSACTION),
SHUT_DOWN(STOP);
private Input[] values;
Category(Input...types) { values = types; }
private static EnumMap<Input, Category> categories =
new EnumMap<Input, Category>(Input.class);
static {
for(Category c : Category.class.getEnumConstants())
for(Input type : c.values)
categories.put(type, c);
}
public static Category categorize(Input input) {
return categories.get(input);
}
}
在 Category 中声明实例时有错误,每个实例名下面都带下划线,错误是: The constructor Category(Input, Input, Input, Input) is undefined 但是我明明定义了啊,请问是什么问题
1
incompatible 2016-08-06 19:15:53 +08:00
Input...只是个语法糖,语义等同于 Input[]
所以你定义的是 Category(Input[]),不是 Category(Input, Input, Input, Input) |
2
captainXxX OP @incompatible 我不知道形参为数组,可不可以传入用逗号分隔的一串参数。。但是形参为可变参列表是可以的。而且参数个数可以不确定。编译器会为我们去填充数组。我在看 Think In Java,书上有例子的。
|
3
captainXxX OP @incompatible 而且我这段代码是抄的书上的。对比了一下,没有发现什么不同, 我不确定是怎么回事。
|
4
sorra 2016-08-06 22:31:48 +08:00
我编译通过了,能运行!
|
5
captainXxX OP 。。。为什么,我这边 JDK1.6 和 1.8 都不行。。。。
|
6
chocotan 2016-08-07 16:10:42 +08:00
代码无问题,一楼说的不对
用的什么 ide ?直接 javac 编译、 java 运行试试 |
7
hqtc 2016-08-07 16:25:01 +08:00
你是声明实例还是创建实例? enum 是没办法使用 new 构造方法的,因为 enum 的构造方法默认而且必须都是 private 的。
|
8
captainXxX OP @chocotan 不行,我用的 MyEclipse10.你那边可以么
|
9
captainXxX OP @hqtc 我知道,代码全在上面,就是这里面有问题。 Category 的定义中, MONEY, ITEM_SELECTION, QUIT_TRANSACTION, SHUT_DOWN 。。这几个实例名下面有红线。。
|
10
hqtc 2016-08-08 09:50:36 +08:00
@captainXxX 。 Intellij IDEA , jdk 1.8 ,实测 代码没有问题
|
11
captainXxX OP @hqtc 好的,谢谢
|