Java Как избежать передачи класса в качестве параметра универсального объекта - PullRequest
0 голосов
/ 26 октября 2018

Я написал следующее:

public class DataContainer<Data>{

    public DataContainer(Class<Data> clazz, String method) throws NoSuchMethodException, SecurityException{

        clazz.getMethod(method);

    }

}

И поэтому я создаю свои объекты таким образом:

new DataContainer<SomeClass>(SomeClass.class, "get");

Но я хотел, чтобы это выглядело больше как:

public class DataContainer<Data>{

    public DataContainer(String method) throws NoSuchMethodException, SecurityException{

        Data.getMethod(method);

    }

}

И вызов конструкции должен выглядеть следующим образом:

new DataContainer<SomeClass>("get");

Как можно избежать передачи класса Data при создании объекта A DataContainer?Я знаю, что Data нельзя манипулировать во время выполнения (new DataContainer<>("get"); -> что такое Data тогда?), Но я слышал, что есть решения, которые можно обойти, к сожалению, похоже, у меня еще нет словаря, чтобы гуглить его.

Также это упрощенная версия моей проблемы, мы предполагаем, что метод допустим, общедоступен и не имеет аргументов.

1 Ответ

0 голосов
/ 26 октября 2018

В действительности вы не можете использовать ваш код из-за стирания типа.

Однако некоторая общая информация сохраняется во время выполнения, т.е. когда она доступна для размышления. Одной из таких ситуаций может быть обобщение в иерархии классов, то есть вы можете сделать что-то вроде этого (что мы делаем довольно часто):

//Note that I used T instead of Data to reduce confusion
//Data looks a lot like an actual class name
public abstract class DataContainer<T>{
  public DataContainer(String method) throws NoSuchMethodException, SecurityException {
    Class<?> actualClass = getActualTypeForT();
    //use reflection to get the method from actualClass and call it
  }

  protected Class<?> getActualTypeForT() {
    //get the generic boundary here, for details check http://www.artima.com/weblogs/viewpost.jsp?thread=208860
  } 
} 

//A concrete subclass to provide the actual type of T for reflection, can be mostly empty
public class SomeClassContainer extends DataContainer<SomeClass> {
  //constructor etc.
}

Нечто подобное должно быть возможно для полей класса или параметров, хотя я этого не проверял.

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