Middle
Өзүңүздүн өнүктүрүү тажрыйбаңызда кайда генериктерди колдондуңуз?
sobes.tech AI
AIден жооп
Жалпысынан колдонулган гениериктер:
- Типке коопсуз коллекциялар түзүү үчүн. Мисалы,
ArrayList<MyObject>ордуна жукаArrayListколдонуу, бул типти өзгөртүү менен байланышкан каталарды алдын алат.// Типке коопсуз эмес ыкма (жука тип) List list = new ArrayList(); list.add("Жол"); list.add(123); // Int кошуу // Гениериктер менен типке коопсуз ыкма List<String> stringList = new ArrayList<>(); stringList.add("Жол"); // stringList.add(123); // Компилятор катаны чыгарат - RecyclerView үчүн универсалдуу адаптерлер түзүү үчүн. Адаптер логикасын ар кандай маалымат түрлөрү үчүн кайра колдонууга мүмкүндүк берет.
// Универсалдуу ViewHolder мисалы class GenericViewHolder<T>(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(item: T) { // T түрүнө жараша маалыматты байлоо логикасы } } // Универсалдуу адаптер мисалы class GenericAdapter<T>(private val items: List<T>) : RecyclerView.Adapter<GenericViewHolder<T>>() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GenericViewHolder<T> { // ViewHolder түзүү } override fun onBindViewHolder(holder: GenericViewHolder<T>, position: Int) { holder.bind(items[position]) } override fun getItemCount() = items.size } - Объект фабрикаларын түзүү үчүн. Конкреттүү түрдөгү объектти алуу үчүн, аны түздөн-түз түргө өткөрбөстөн.
interface Factory<T> { T create(); } class StringFactory : Factory<String> { override fun create(): String { return "Жаңы жол"; } } class IntegerFactory : Factory<Int> { override fun create(): Int { return 100; } } Factory<String> stringFactory = StringFactory(); val myString: String = stringFactory.create(); // String алдык, түргө өткөрбөстөн - Типтерди чектөө үчүн. Чектелген гениериктерди колдонуу (
<T extends MyInterface>же<T super MyClass>) белгилүү бир интерфейсти ишке ашырган же белгилүү бир класстан мурас алган типти камсыз кылуу үчүн.// Метод, Serializable интерфейсин ишке ашырган элементтердин тизмесин кабыл алат public <T extends Serializable> void saveObjectList(List<T> list) { // Сактоо логикасы } - Архитектуралык компоненттерде. Мисалы, LiveData же ViewModel менен иштөөдө, көбүнчө гениериктер колдонулат, алар башкарган маалыматтардын түрүн аныктоо үчүн.
// Белгилүү бир түрдөгү объекттердин тизмеси үчүн LiveData val myData: LiveData<List<MyItem>> = // баштоо // Белгилүү бир түрдөгү маалыматтар менен ViewModel class MyViewModel : ViewModel() { val data: MutableLiveData<MyStateType> by lazy { MutableLiveData<MyStateType>() } } - Тармактык кардарларды иштеп чыгууда. Серверден келген жоопторду конкреттүү түргө автоматтык десериализациялоо үчүн.
// Retrofit кызматтын мисалы гениерик менен жоопто interface ApiService { @GET("users") Call<List<User>> getUsers(); @GET("products/{id}") Call<Product> getProduct(@Path("id") String productId); }
Гениериктер коддун тип коопсуздугун, окумдуулугун жана кайра колдонулушу мүмкүнчүлүгүн жогорулатат.