通用类方法调用

时间:2016-04-13 16:16:59

标签: java generics

我因为缺乏对仿制药的了解而道歉...我试图理解仿制药是如何工作的,我不确定它是什么但是我错过了一个关键部分,这是我想要的,所以希望有人可以澄清一个更多,让我超过这个驼峰。

BaseDtoUtil.mapToDto(map, OcrImageDocDto.class); //OcrImageDocDto extends DtoUtils

//This method is in class BaseDtoUtil
public static <T> List<T> mapToDto(Map<String, Object> map, Class<? extends DtoUtils> klass) throws SparkSQLException{
      T obj = (T)klass.newInstance();
      //return a list of these
}

所以我想我有两个问题:

  1. 首先,当为方法调用定义的变量是任何类时传入OcrImageDocDto.class时,为什么会抱怨? (我原来把它当作(Class<?>)这不是指任何阶级价值吗?显然我错了,但不确定那意味着什么。
  2. 第二个问题是,如果我发送一个类值,我实际上能够获取该实例并返回一个类型值吗? <T> List<T>?如果我没有弄错,我相信通用变量<T> List<T>用于对象的实例化。但如果它是一种静态方法,他们会怎么做?
  3. 我有点迷失,也许我理解泛型是错误的......所以如果有人能清除这两个,我觉得它会有很大的帮助!

1 个答案:

答案 0 :(得分:2)

问题1:

distinct_persons = set()

def get_distinct_persons(population):

    for person in population.persons:
        distinct_persons.add(person.person_id)

if __name__ == '__main__':

    population =  Population()
    person1 = Person(1)
    population.persons.append(person1)
    person2 = Person(2)
    population.persons.append(person2)
    get_distinct_persons(population)

您不知道可以将public static <T> List<T> mapToDto( Map<String, Object> map, Class<? extends DtoUtils> klass) throws SparkSQLException{ T obj = (T)klass.newInstance(); ... 强制转换为klass.newInstance() - 您只知道它是T(或子类)的实例。

因此,您可以更改为使用:

DtoUtils

或约束DtoUtils obj = klass.newInstance(); 以扩展T

DtoUtils

问题2:

是的,因为你有一个实际的类实例。由于类型擦除,您将无法创建没有该实例的实例(或可以提供public static <T extends DtoUtils> List<T> mapToDto( Map<String, Object> map, Class<? extends T> klass) throws SparkSQLException{ T obj = klass.newInstance(); ... 实例的其他对象)。

这不起作用:

T

以下内容的工作正常:

public static <T extends DtoUtils> List<T> mapToDto(
    Map<String, Object> map) throws SparkSQLException{
  T obj = new T();  // Compiler error.