Getting compiler error while using array constants in the constructor

后端 未结 3 1751
面向向阳花
面向向阳花 2020-12-05 22:30
public class Sonnet29 implements Poem {
    private String[] poem;
    public Sonnet29() {
        poem = { \"foo\", \"bar\" , \"baz\"};
    }
    @Override
    publ         


        
相关标签:
3条回答
  • 2020-12-05 23:19

    From the Java language specification:

    An array initializer may be specified in a declaration, or as part of an array creation expression (§15.10), creating an array and providing some initial values

    In short, this is legal code:

    private int[] values1 = new int[]{1,2,3,4};
    private int[] values2 = {1,2,3,4}; // short form is allowed only (!) here
    
    private String[][] map1 = new String[][]{{"1","one"},{"2","two"}};
    private String[][] map2 = {{"1","one"},{"2","two"}}; // short form
    
    List<String> list = Arrays.asList(new String[]{"cat","dog","mouse"});
    

    and this is illegal:

    private int[] values = new int[4];
    values = {1,2,3,4}; // not an array initializer -> compile error
    
    List<String> list = Arrays.asList({"cat","dog","mouse"}); // 'short' form not allowed
    
    0 讨论(0)
  • 2020-12-05 23:26

    This will do what you're looking for:

    public Sonnet29() {
        poem = new String[] { "foo", "bar", "baz" };
    }
    

    Initialization lists are only allowed when creating a new instance of the array.

    0 讨论(0)
  • 2020-12-05 23:27
    {"cat", "dog"}
    

    Is not an array, it is an array initializer.

    new String[]{"cat", "dog"}
    

    This can be seen as an array 'constructor' with two arguments. The short form is just there to reduce RSI.

    They could have given real meaning to {"cat", "dog"}, so you could say things like

    {"cat", "dog"}.length
    

    But why should they make the compiler even harder to write, without adding anything useful? (ZoogieZork answer can be used easily)

    0 讨论(0)
提交回复
热议问题