2016-04-29 3 views
1

Возможно ли сделать метод Generic без создания класса? Есть ли способ для достижения ниже, используя общий тип?Можно ли создать общий метод, не возвращая класс, который будет возвращен. Список <T>

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

public class Test { 

    public List<T> execute(String name, Map<String, Object> params, List<T> type) { 
      List<Object> emps = new ArrayList<Object>(); 
      emps.add(new Employee()); 
     //emps object will be generated dynamically 
     return (List<T>)emps; 
    } 

    public static void main(String[] args) { 
     Test test = new Test(); 
     test.execute("testing", null, new ArrayList<Employee>()); 
    } 
} 

ответ

2

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

public <T> List<T> execute(String name, Map<String, Object> params, List<T> type) { 
    List<Object> emps = new ArrayList<Object>(); 
    emps.add(new Employee()); 
    //emps object will be generated dynamically 
    return (List<T>) emps; 
} 

Посмотрите на это объяснение:

Компилятор Java использует целевой типизации определить тип параметры общего вызова метода. Целевой тип выражения - это тип данных, который ожидает компилятор Java в зависимости от , на котором появляется выражение. Рассмотрим метод Collections.emptyList, который объявлен следующим образом:

static <T> List<T> emptyList(); Рассмотрим следующее назначение заявление:

List<String> listOne = Collections.emptyList(); Это утверждение ожидает экземпляр List<String>; этот тип данных является целевой типа. Поскольку метод emptyList возвращает значение типа List<T>, , компилятор сообщает, что аргумент типа T должен быть значением String. Это работает как Java SE 7 и 8. В качестве альтернативы, вы можете использовать тип свидетеля и указать значение Т следующим образом:

List<String> listOne = Collections.<String>emptyList();

https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html

3

Да, вы можете определить метод как обобщенный в неэквивалентном классе, объявив его как общий, используя нотацию <T>.

Простое изменение метода подпись:

public <T> List<T> execute(String name, Map<String, Object> params, List<T> type) 

И метод будет возвращать общий List объект типа T.

0

Try под ним должны работать

public List<?> execute(String name, Map<String, Object> params, List<?> type) { 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^