Я искал SO и нашел несколько ответов, очевидно, связанные с моим вопросом, и прочитал следующее, а также:Java (Android) - типы, дженерики, конструктор подписи, извлекая ссылки на класс
http://docs.oracle.com/javase/tutorial/java/generics/erasure.html Http: //www.artima.com/weblogs/viewpost.jsp?thread=208860 http://docs.oracle.com/javase/tutorial/extra/generics/index.html http://docs.oracle.com/javase/tutorial/java/generics/genmethods.html
Но ты немного над моей головой (я довольно новичок в Java и Android).
Я пытаюсь понять, как реализовать родовое в пользовательском классе. Я думаю, что пример будет лучшим способом объяснить это.
Скажем, я начинаю с этого базового класса:
import java.util.ArrayList;
import android.content.Context;
import android.widget.ImageView;
public class ViewPool {
private ArrayList<ImageView> employed;
private ArrayList<ImageView> unemployed;
private Context context;
public ViewPool(Context context){
this.context = context;
employed = new ArrayList<ImageView>();
unemployed = new ArrayList<ImageView>();
}
public ImageView employView(){
ImageView v;
if(unemployed.size() > 0){
v = unemployed.get(0);
unemployed.remove(v);
} else {
v = new ImageView(context);
}
employed.add(v);
return v;
}
public void retireView(ImageView v){
if(employed.contains(v)){
employed.remove(v);
unemployed.add(v);
}
}
}
Теперь, скажем, я хочу изменить выше, чтобы работать с любым видом типа, пролетели как:
new ViewPool<ImageView>(this);
или .. .
new ViewPool<TextView>(this);
Как бы переписать класс, указанный выше, чтобы принять такие типы? Мои первые попытки, что-то вроде этого следующего блока кода, не удалось за то, что, вероятно, очевидные причины ...
public class ViewPool<E> {
...
public E employView(){
E v;
if(unemployed.size() > 0){
v = unemployed.get(0);
unemployed.remove(v);
} else {
v = new E(context); // this line's obviously bad, but not sure what would be correct
}
employed.add(v);
return v;
}
...
Благодаря
спасибо за ответ ... Как же тогда будет Я собираюсь получить ссылку на generic, чтобы я мог представить новый? –
momo
Посмотрите на мой пример, вы должны использовать завод для достижения этого. В java нет наследования конструкторов, поэтому невозможно использовать какой-либо общий вид конструктора для создания представления из нотации generics. Работа вокруг (и на самом деле хороший дизайн) - это использование фабрики. Кроме того, он имеет 2 преимущества: вы отделяете объединение от создания экземпляров в пуле, и вы явно объявляете зависимость от объекта, ответственного за создание объектов. – Snicolas
Да, вопрос в моем первом комментарии был до вашего примера. Я вижу, что вы делаете, и можете оценить образец. благодаря – momo