Как вызвать метод, который требует объект класса <T>в качестве параметра? - PullRequest
3 голосов
/ 11 декабря 2011

У меня есть класс, в котором мне нужен конструктор для инициализации массива переменных.Я исследовал в Интернете, а также переполнение стека, но теперь я застрял на том, как вызвать метод.Например, как я могу вызвать method1 в моем примере?

public class SomeClass<T>{

   public T[] array;

   //Constructor
   public SomeClass()
   {
        Method1(T, 5); //?  error
        Method1(5); //?   error
        Method1(new T().GetType(), 5); //? error
        // HOW CAN I CALL THAT METHOD?

        array = (T[])(new Object[5]); // this gives an error too
   }

   private void Method1(Class<T> type, int size)
   {
       array = (T[])Array.newInstance(type, size);
   }
}

Ответы [ 2 ]

5 голосов
/ 11 декабря 2011

Попробуйте это:

class SomeClass<T> {

    private T[] array;

    @SuppressWarnings("unchecked")
    public SomeClass(Class<T> klass, int size) {
        array = (T[]) Array.newInstance(klass, size);
    }

}

И для его создания:

SomeClass<Integer> example = new SomeClass<Integer>(Integer.class, 10);

Имейте в виду, что созданный массив является массивом объектов, и все его элементы будут null доВы явно назначаете их.

3 голосов
/ 11 декабря 2011

Вам необходимо передать объект Class, представляющий T, в конструктор SomeClass:

public SomeClass(Class<T> clazz)
{
   array = Method1(clazz, 5);
}

Это необходимо, поскольку Тип Erasure , что означает, что T не будет иметь значения во время выполнения (Array.newInstance принимает объект Class, представляющий тип элемента массива для по той же причине).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...