2012-01-14 3 views
1

Я искал 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; 
    } 
... 

Благодаря

ответ

3

Вы можете попробовать

public class ViewPool<E extends View> 

затем создать экземпляр ваш взгляд, вам может использовать завод с подписью:

public abstract class ViewFactory<E extends View> { 
    public E createView(Context c); 
} 

и использовать его в себе viewpool to получить новый экземпляр Е, вводя зависимость во время строительства для viewpool:

public class ViewPool<E extends View> { 

ViewFactory<E> factory; 

public viewpool(ViewFactory<E> factory) { 
    this.factory = factory; 
} 

public E employView(){  
    E v; 
    if(unemployed.size() > 0){ 
     v = unemployed.get(0); 
     unemployed.remove(v); 
    } else { 
     v = factory.createView(context); 
    } 
    employed.add(v); 
    return v; 
} 

}

Затем создайте viewpool с помощью:

ViewFactory<TextView> factory = new ViewFactory<TextView>() { 
    public TextView createView(Context c) { 
     return new TextView(c); 
    } 
} 
new ViewPool<TextView>(factory); 
+0

спасибо за ответ ... Как же тогда будет Я собираюсь получить ссылку на generic, чтобы я мог представить новый ? – momo

+0

Посмотрите на мой пример, вы должны использовать завод для достижения этого. В java нет наследования конструкторов, поэтому невозможно использовать какой-либо общий вид конструктора для создания представления из нотации generics. Работа вокруг (и на самом деле хороший дизайн) - это использование фабрики. Кроме того, он имеет 2 преимущества: вы отделяете объединение от создания экземпляров в пуле, и вы явно объявляете зависимость от объекта, ответственного за создание объектов. – Snicolas

+0

Да, вопрос в моем первом комментарии был до вашего примера. Я вижу, что вы делаете, и можете оценить образец. благодаря – momo

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