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 好的,谢谢 |