2012-02-23 3 views
1

Можно создать дубликат:
Instantiating a generic class in JavaСоздание объекта с использованием типа Generics Java

Я изучаю Generics Java, потому что я хотел бы реализовать это:

У меня есть 2 классов которые используют 1 общий класс, и в этом общем классе я хочу создать объект универсального класса. Здесь есть часть моего кода, так что это будет проще всего.

//MyFirstClass.java 
class MyFirstClass{ 
    ... 
    MyExpandableListAdapter<FirstFilter> mAdapter = new MyExpandableListAdapter<FirstFilter>(); 
    ... 
} 

//MySecondClass.java 
class MySecondClass{ 
    ... 
    MyExpandableListAdapter<SecondFilter> mAdapter = new MyExpandableListAdapter<SecondFilter>(); 
    ... 
} 

//common class MyExpandableListAdapter.java 
public class MyExpandableListAdapter<E extends Filter> extends BaseExpandableListAdapter implements Filterable { 
    private E filter; 
    ... 
    public Filter getFilter(){ 
     if (filter== null) 
      filter = new <E>(); // Here I want to create an Object, but I get an error on <E> 
     return filter; 
    } 
} 

Возможно ли это? Как я мог это сделать? Пожалуйста, помогите мне. Большое спасибо.

ответ

2

Из-за способа, в котором реализовано generic, невозможно полностью создать общий параметр, который вы пытаетесь сделать здесь.

Обычная альтернатива заключается в использовании какого-то завода, то есть класс, который реализует интерфейс, похожий на:

interface Factory<E> { 
    E newInstance(); 
} 

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

+1

Большое спасибо, я решил с вашей помощью :) Приятного дня;) – sleone08

1

У вас нет доступа к E во время выполнения так, как вы хотите. Вы можете взломать вокруг, но это немного грязный:

protected Class<E> filterClass; 

@SuppressWarnings("unchecked") 
public MyExpandableListAdapter() { 
    filterClass = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 
} 

После того, как класс, вы можете использовать отражение для создания экземпляра. См. this tutorial for more information.

Вы должны учитывать, стоит ли добавить дополнительную сложность.

+0

Большое спасибо. Я решил использовать решение, отправленное Andrzej Doyle. Я думаю, что я попробую и вашу идею к любопытству :) Это еще одно хорошее решение :) Хорошего дня;) – sleone08

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