JAVA 枚举类型的问题。

2016-08-06 17:54:23 +08:00
 captainXxX

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 但是我明明定义了啊,请问是什么问题

2883 次点击
所在节点    Java
11 条回复
incompatible
2016-08-06 19:15:53 +08:00
Input...只是个语法糖,语义等同于 Input[]
所以你定义的是 Category(Input[]),不是 Category(Input, Input, Input, Input)
captainXxX
2016-08-06 21:10:34 +08:00
@incompatible 我不知道形参为数组,可不可以传入用逗号分隔的一串参数。。但是形参为可变参列表是可以的。而且参数个数可以不确定。编译器会为我们去填充数组。我在看 Think In Java,书上有例子的。
captainXxX
2016-08-06 21:12:26 +08:00
@incompatible 而且我这段代码是抄的书上的。对比了一下,没有发现什么不同, 我不确定是怎么回事。
sorra
2016-08-06 22:31:48 +08:00
我编译通过了,能运行!
captainXxX
2016-08-07 08:08:11 +08:00
。。。为什么,我这边 JDK1.6 和 1.8 都不行。。。。
chocotan
2016-08-07 16:10:42 +08:00
代码无问题,一楼说的不对

用的什么 ide ?直接 javac 编译、 java 运行试试
hqtc
2016-08-07 16:25:01 +08:00
你是声明实例还是创建实例? enum 是没办法使用 new 构造方法的,因为 enum 的构造方法默认而且必须都是 private 的。
captainXxX
2016-08-07 21:03:05 +08:00
@chocotan 不行,我用的 MyEclipse10.你那边可以么
captainXxX
2016-08-07 21:05:51 +08:00
@hqtc 我知道,代码全在上面,就是这里面有问题。 Category 的定义中, MONEY, ITEM_SELECTION, QUIT_TRANSACTION, SHUT_DOWN 。。这几个实例名下面有红线。。
hqtc
2016-08-08 09:50:36 +08:00
@captainXxX 。 Intellij IDEA , jdk 1.8 ,实测 代码没有问题
captainXxX
2016-08-08 11:14:33 +08:00
@hqtc 好的,谢谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/297592

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX