Инициализация массива на лету в конструкторе (Java) - PullRequest
4 голосов
/ 29 сентября 2011
 public class A{
      public A(int[] a){}
 }

 public class B extends A{
      public B(double[] b){
           super({b.length});  //ERROR
      }
 }

Я хочу иметь возможность скомпилировать код выше.Чтобы уточнить, у меня есть класс A и B, который расширяет его.Класс A не имеет пустого конструктора параметров.Если я не помещу вызов super в конструктор класса B в первой строке, он попытается вызвать super (), которого не существует.Но я хочу вместо этого назвать super (int [] a).Я хочу сделать это, взяв длину заданного двойного массива и отправив его в виде массива длиной 1. Это не позволяет мне сделать это, потому что, очевидно, вы не можете объявить такой массив, и если бы я объявил егов отдельной строке он сначала вызовет super (), и это не сработает.

Есть ли способ объявить int [] на лету таким образом?Или здесь единственное решение - создать конструктор для A без параметров или создать собственную функцию, возвращающую int []?

(Не спрашивайте, почему я хочу отправить его в виде такого массива.)

Ответы [ 3 ]

7 голосов
/ 29 сентября 2011

Если вы настаиваете на том, что не спрашиваете почему ...

Вы можете создать массив, назначить первый и единственный элемент и отправить его.

public class B extends A{
      public B(double[] b){
           int[] arr = new int[1];
           arr[0] = b.length;
           super(arr);  // broken, super must be first.
      }
}

Это означает, что вы должны иметь решение в одну строку.К счастью, Java предоставляет встроенный способ преобразования ряда элементов в массив во время компиляции.

public class B extends A{
      public B(double[] b){
           super(new int[]{b.length});  // FIXED
      }
}
4 голосов
/ 29 сентября 2011

Вы также можете

 public class A{
    public A(int... a){}
 }

 public class B extends A{
    public B(double[] b){
       super( b.length ); 
  }
 }
4 голосов
/ 29 сентября 2011

Да, попробуйте:

 super(new int[]{b.length});  //ERROR NO MORE
...