1. 程式人生 > >Android下關於泛型class型別的獲取

Android下關於泛型class型別的獲取

1. 目的

在Android開發中,MVP模式的開發為大多數人所使用,在MVP模式中,一般需要在Activity中建立與之對應的Presenter類。之前專案中實現的方法比較繁瑣,通過查資料以後,進行了部分優化,特此記錄。

2. 老的實現方式

不廢話,直接上程式碼。

    public abstract class BaseActivity<T extends BasePresenter> extends Activity{
        protected T mPresenter;
        @Override
        protected void
onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = createPresenter(); } /** * 定義一個抽象方法,由繼承BaseActivity的子類去實現 */ protected abstract T createPresenter(); } class TestActivity extends BaseActivity<TestPresenter> { /** * 在每個繼承BaseActivity的子Activity去實現createPresenter方法 */
@Override protected TestPresenter createPresenter() { return new TestPresenter(this); } }

3. 改進以後的實現方式

/*
* 這裡在base內部實現了createPresenter方法,當然還有可能有其他的抽象方法,所以這裡的類暫時還是用一個抽象類
* 來表示
*/
public abstract class BaseActivity<T extends BasePresenter> extends Activity
{
protected T mPresenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = createPresenter(); } /** * 直接在createPresenter中拿到當前類的泛型的class,利用反射製造一個物件並返回 */ protected T createPresenter(){ //這裡獲得到的是類的泛型的型別 ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); if (type != null) { Type[] actualTypeArguments = type.getActualTypeArguments(); Class<T> tClass = (Class<T>) actualTypeArguments[0]; mPresenter = PresenterFactory.creatPresenter(tClass); } }; /** * presenter 的工廠類 */ public class PresenterFactory { public static <T extends BasePresenter> T creatPresenter(Class<T> tClass) { T t = null; try { t = tClass.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return t; } } /* * 繼承了BaseActivity的子類,不再需要實現createPresenter方法,可以直接使用mPresenter進行操作 */ class TestActivity extends BaseActivity<TestPresenter> { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //直接使用presenter類(不再需要通過實現createPresenter方法來得到presenter的物件) mPresenter.doSth(); } }

3. 總結

這裡拿Activity和Presenter類來舉例,其實在開發中還有其他的場景,需要在一個公共的父類下,有一個可變的引數型別的物件,在具體的子類中去指定這個可變引數型別的型別的場景。當然了,以上只是個人的一些體會與經驗,如果有錯誤之處,還望讀者予以指正。

相關推薦

Android關於class型別獲取

1. 目的 在Android開發中,MVP模式的開發為大多數人所使用,在MVP模式中,一般需要在Activity中建立與之對應的Presenter類。之前專案中實現的方法比較繁瑣,通過查資料以後,進行了部分優化,特此記錄。 2. 老的實現方式 不廢話,

java 通過反射獲取型別

分享一下我老師大神的人工智慧教程吧。零基礎,通俗易懂!風趣幽默!http://www.captainbed.net/ 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

如何獲取型別

@Override public void loadImage(@NonNull Context context, @Nullable String url, @Nullable Options options, @Nullable ILoaderListener

過載和覆蓋的區別,通過反射獲取實際型別,列舉要點,五個最常用的集合類之間的區別和聯絡,final總結

java面試碰到過的題目之方法過載和覆蓋的區別。 1. 過載方法必須滿足以下條件:  i. 方法名相同。 ii. 方法的引數型別、個數、順序至少有一項不同。 iii. 方法的返回型別可以不相同。 iv. 方法的修飾符可以不相同。 2. 重寫方法必須滿足以下條件:  i. 子

子類獲取父類的模板型別方法

package com.zjh.test; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import org.junit.Test; abstract class Ba

在base類中獲取型別物件

class A<T,S> {     //獲取S的class public Class<T> poClass = (Class<T>) (((ParameterizedType) this.getClass().getGeneric

反射獲取真實型別

<pre name="code" class="java">public class Animal<T> { } import java.lang.reflect.Para

ParameterizedType獲取java引數型別

##前言 這兩天在看以前寫的ssh專案時,遇到一個問題就是封裝的BaseDaoImpl抽象類,構造方法裡面是這樣寫的 Class<T> clazz; public BaseDaoImpl(){ ParameterizedType pt =

Java中Class<T>、T與Class<?>

arraylist new 對象類型 創建 集合 spa div get 裏的 一.區別 單獨的T 代表一個類型 ,而 Class<T>代表這個類型所對應的類, Class<?>表示類型不確定的類 E - Element (在集合中使用,因為集合

Android通過簡化findViewById類轉換

視頻 泛型 例如 android 每次 取代 創建 ase 直接 曾經老用findViewById,每次使用還得add cast一下今天看到一個視頻(依據視頻中使

Android如何使用smem工具獲取程序的記憶體分佈

首先需要藉助busybox 在手機上執行 msm8953_64:/ # busybox smemcap > /data/metadata.tar 將metadata.tar放到ubuntu系統的主機 主機上執行如下指令:

java 型別擦除和橋方法

oracle原文地址:https://docs.oracle.com/javase/tutorial/java/generics/erasure.html  在Java中,泛型的引入是為了在編譯時提供強型別檢查和支援泛型程式設計。為了實現泛型,Java編譯器應用型別擦除實現:   &n

Java型別擦除

一、什麼是泛型; 泛型的本質是 引數化型別,也就是說 將所操作的資料型別 指定為一個引數,在不建立新的型別的情況下,通過泛型指定的不同型別,來控制形參具體限制的型別。類似於方法中的變數引數,此時型別也定義成引數形式,然後在使用的過程中,指定具體的型別。 這種引數型別可以在

java.util.LinkedHashMap cannot be cast to com.*** resetTemplate的GET請求返回值為帶型別

原因:             resetTemplate的GET請求返回值為帶泛型的型別不可以直接使用,因為他內部封裝成了一個LinkedHashMap,所以我們直接用的時候就會報錯 解決:  

kotlin 型別投射

fun main(arg: Array<String>) { var ints:Array<Int> = arrayOf(1, 2, 3) val any =Array<Any>(3){} copy(ints,any)//編譯錯誤,因為A

JAVA 型別擦除

★ 泛型是 JDK 1.5 版本引進的概念,之前是沒有泛型的概念的,但泛型程式碼能夠很好地和之前版本的程式碼很好地相容。   CollectionTest.java ---編譯成CollectionTest.class ----JVM中執行 因為泛型資訊只存在於程式碼編譯階段,編譯器編譯完帶有

Java 8 新特性:目標型別推斷

泛型目標型別推斷 文 | 莫若吻      (注:以下內容是其他作者網上翻譯的資料,中文原創找不到了,無法給出原創譯文地址,覺得不錯就轉載過來了。) 1.簡單理解泛型 如果你還不瞭解什麼是泛型,請點選進入《泛型》詳細情況地址: 泛型是Java SE 1.5的新

android方法的用法和作用

舉個例子 首先我的activity中  @Route(path = "/datainit/DataInitActivity") class DataInitActivity: BaseActivity(){ override fun onCreate(savedInstan

Java型別擦除

型別擦除 學過C++模板的,在使用Java泛型的時候,會感覺到有點不疑問,例如:(1)無法定義一個泛型陣列、無法呼叫泛型引數物件中對應的方法(當然,通過extends關鍵字是可以做到,只是比較麻煩);(2)ArrayList<Integer>和ArrayList<String>在執行

通過反射獲得實際型別

通過反射獲得泛型實際型別 1.獲得類的泛型 2.獲得方法引數中的泛型實際型別 3.獲得方法返回值中的泛型實際型別 4.獲得萬用字元型別的上下界 1.獲得類的泛型 子類繼承泛型父類,並對泛型進行指定,通過反射