Создание объекта параметра типа с использованием отражений - PullRequest
0 голосов
/ 27 февраля 2020

Я знаю, что при работе с Generics мы не можем создать экземпляр объекта неизвестного типа, например, стат: T var = new T () выдаст ошибку времени компиляции, я пробовал использовать Reflections после некоторого поиска, но не компилировал и выдает ошибку, о которой я упомяну в конце

Код:

public class HelloWorld{
     public static void main(String []args){
        Pair<Integer> obj = new Pair<Integer>(Integer.class);
                            obj.<Integer>func();             
    }
}
class Pair<T>
{
    T  var;
   <T> Pair(){}
   <T> Pair(Class<T> reflection){
             var = reflection.newInstance() ;  
             }

   <T> void func(){
   System.out.println(var);
   }
}

Ошибка:

HelloWorld.java:12: error: incompatible types: T#1 cannot be converted to T#2
             var = reflection.newInstance() ;  
                                         ^
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in constructor <T#1>Pair(Class<T#1>)
    T#2 extends Object declared in class Pair

Я пытаюсь найти причину ошибки, но не может достичь этого

1 Ответ

3 голосов
/ 27 февраля 2020
class Pair<T>
{
    T  var;
   <T> Pair(){}
   <T> Pair(Class<T> reflection){
             var = reflection.newInstance() ;  
             }

   <T> void func(){
   System.out.println(var);
   }
}

<T> в конструкторах и методе определяют другую переменную типа, которая скрывает переменную в классе. Все они называются "T", но это разные типы.

(те, что в конструкторе с нулевым аргументом и func все равно не используются).

Удалите эти дополнительные объявления переменных типа.

class Pair<T> {
  T var;

  Pair() {}

  Pair(Class<T> reflection) {
    var = reflection.newInstance();
  }

  void func() {
    System.out.println(var);
  }
}

Тогда вам просто нужно иметь дело с тем фактом, что не у всех классов есть доступные конструкторы с нулевым аргументом; и что newInstance() выдает проверенные исключения, которые вам необходимо обработать.

Лучшим подходом было бы предоставить Supplier<T>:

  Pair(Supplier<T> reflection) {
    var = reflection.get();
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...