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.獲得類的泛型 子類繼承泛型父類,並對泛型進行指定,通過反射