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 但是我明明定义了啊,请问是什么问题
|  |      1incompatible      2016-08-06 19:15:53 +08:00 Input...只是个语法糖,语义等同于 Input[] 所以你定义的是 Category(Input[]),不是 Category(Input, Input, Input, Input) | 
|      2captainXxX OP @incompatible 我不知道形参为数组,可不可以传入用逗号分隔的一串参数。。但是形参为可变参列表是可以的。而且参数个数可以不确定。编译器会为我们去填充数组。我在看 Think In Java,书上有例子的。 | 
|      3captainXxX OP @incompatible 而且我这段代码是抄的书上的。对比了一下,没有发现什么不同, 我不确定是怎么回事。 | 
|  |      4sorra      2016-08-06 22:31:48 +08:00 我编译通过了,能运行! | 
|      5captainXxX OP 。。。为什么,我这边 JDK1.6 和 1.8 都不行。。。。 | 
|  |      6chocotan      2016-08-07 16:10:42 +08:00 代码无问题,一楼说的不对 用的什么 ide ?直接 javac 编译、 java 运行试试 | 
|  |      7hqtc      2016-08-07 16:25:01 +08:00 你是声明实例还是创建实例? enum 是没办法使用 new 构造方法的,因为 enum 的构造方法默认而且必须都是 private 的。 | 
|      8captainXxX OP @chocotan 不行,我用的 MyEclipse10.你那边可以么 | 
|      9captainXxX OP @hqtc 我知道,代码全在上面,就是这里面有问题。 Category 的定义中, MONEY, ITEM_SELECTION, QUIT_TRANSACTION, SHUT_DOWN 。。这几个实例名下面有红线。。 | 
|  |      10hqtc      2016-08-08 09:50:36 +08:00 @captainXxX 。 Intellij IDEA , jdk 1.8 ,实测 代码没有问题 | 
|      11captainXxX OP @hqtc 好的,谢谢 |