V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
captainXxX
V2EX  ›  Java

JAVA 枚举类型的问题。

  •  
  •   captainXxX · 2016-08-06 17:54:23 +08:00 · 2889 次点击
    这是一个创建于 3038 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    用的什么 ide ?直接 javac 编译、 java 运行试试
    hqtc
        7
    hqtc  
       2016-08-07 16:25:01 +08:00
    你是声明实例还是创建实例? enum 是没办法使用 new 构造方法的,因为 enum 的构造方法默认而且必须都是 private 的。
    captainXxX
        8
    captainXxX  
    OP
       2016-08-07 21:03:05 +08:00
    @chocotan 不行,我用的 MyEclipse10.你那边可以么
    captainXxX
        9
    captainXxX  
    OP
       2016-08-07 21:05:51 +08:00
    @hqtc 我知道,代码全在上面,就是这里面有问题。 Category 的定义中, MONEY, ITEM_SELECTION, QUIT_TRANSACTION, SHUT_DOWN 。。这几个实例名下面有红线。。
    hqtc
        10
    hqtc  
       2016-08-08 09:50:36 +08:00
    @captainXxX 。 Intellij IDEA , jdk 1.8 ,实测 代码没有问题
    captainXxX
        11
    captainXxX  
    OP
       2016-08-08 11:14:33 +08:00
    @hqtc 好的,谢谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   923 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:15 · PVG 05:15 · LAX 13:15 · JFK 16:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.