導航:首頁 > 編程語言 > 如何知道一個java對象的泛型類型

如何知道一個java對象的泛型類型

發布時間:2023-03-19 09:49:51

① 如何獲取 java 的泛型中的對象類型

/**
*獲取field的類型,如果是復合對象,獲取的是泛型的類型
*
*@paramfield
*@return
*/
(Fieldfield){
ClassfieldClazz=field.getType();

if(fieldClazz.isAssignableFrom(List.class)){
Typefc=field.getGenericType();//關鍵的地方,如果是List類型,得到其Generic的類型

if(fcinstanceofParameterizedType)//如果是泛型參數的類型
{
ParameterizedTypept=(ParameterizedType)fc;

fieldClazz=(Class)pt.getActualTypeArguments()[0];//得到泛型里的class類型對象。
}
}

returnfieldClazz;
}

正好這幾天剛寫了相關代碼,供參考

② java中如何知道一個Class的泛型Class

String s = "";
s.getClass().getSuperclass();
如租察果返回值為null 說明已經是最高睜派級別的了悉型賀,一般object的superclass才為null

③ 如何獲取 java 的泛型中的對象類型

獲取java泛型中的對象類型,可以參考如下代碼:


/**
*通過反射取到List<T>中T的類型
*@paramclazz
*@paramfield
*拿祥@return
*/
publicstaticClass<?extendsObject>getGenericType(Class<?extendsObject>clazz,Fieldfield){
MethodgetMethod=肢伏getGetMethodByField(clazz,field);
ParameterizedTypept=(ParameterizedType)getMethod.getGenericReturnType();

Class<?extendsObject>type歷敏攜=(Class<?>)pt.getActualTypeArguments()[0];
//System.out.println(type.getSimpleName());
//System.out.println(type.getPackage());
returntype;
}

④ 如何獲取java泛型的參數類型

一般可以使用反射來獲取泛型參數的實際類型,以下是詳細代碼:
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;

public class GenericTest {
/*使用反射來獲取泛型信息*/
private Map<String, Integer> score;
public static void main(String[] args) throws SecurityException, NoSuchFieldException {
//Class clazz = GenericTest.class;
Class<GenericTest> clazz = GenericTest.class;
//System.out.println(clazz);
Field f = clazz.getDeclaredField("score");

//直接使用getType只對普通類型有效,無法取到泛型參數
Class<?> a = f.getType();
System.out.println("score的類型是:"+a);

//獲得Field實例f的泛型類型
Type gType = f.getGenericType();
//如果gType類型是ParameterizedType的對象
if (gType instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) gType;
//獲取原始類型
Type rType = pType.getRawType();
System.out.println("原始類型是:"+rType);
//取得泛型類型參數
Type[] tArgs = pType.getActualTypeArguments();
System.out.println("泛型類型是:");
for (int i = 0; i < tArgs.length; i++) {
System.out.println("第"+i+"個泛型類型是:"+tArgs[i]);
}
}else{
System.out.println("獲取泛型類型出錯!");
}
}
}
輸出結果如下:
score的類型是:interface java.util.Map
原始類型是:interface java.util.Map
泛型類型是:
第0個泛型類型是:class java.lang.String
第1個泛型類型是:class java.lang.Integer

⑤ java怎麼獲取一個泛型方法的真實泛型類型

用gentyref這個工具應該能解決你的問題。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import com.googlecode.gentyref.GenericTypeReflector;

public class ClassWithGenericMethod {

public <T> void chill(List<T> aListWithTypeT) {
System.out.println(GenericTypeReflector.getTypeParameter(aListWithTypeT.getClass(), Collection.class.getTypeParameters()[0]));
}

public void chillWildcard(List<?> aListWithTypeWildcard) {
System.out.println(GenericTypeReflector.getTypeParameter(aListWithTypeWildcard.getClass(), Collection.class.getTypeParameters()[0]));
}

public <T> T chillReturn(Class<T> c) {
T ret = null;
try {
ret = c.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
System.out.println(ret.getClass());
return ret;
}

public static void main(String... args) {
ClassWithGenericMethod cwfm = new ClassWithGenericMethod();
cwfm.chill(new ArrayList<String>(){});
cwfm.chillWildcard(new ArrayList<Integer>(){});
cwfm.chillReturn(ClassWithGenericMethod.class);
}

}

⑥ 請問Java怎麼取得一個對象的泛型類型

//泛型並沒有想像中那那麼強力……
//換句話說就是裡面什麼都能放
//判斷這個列表是什麼類型的並沒有意義

import java.util.ArrayList;
import java.util.List;

public class Main{

public static void printType(Object object){
if(object instanceof List){
List list=(List)object;//什麼都能放
list.add(new Main());

if(!list.isEmpty()){
for(Object o:list)
System.out.println(o.getClass().getSimpleName());

//System.out.println("object是List<String>類型螞御高旁");
}else{
System.out.println("object是List,但是不是悶念岩List<String>類型");
}
}else{
System.out.println("object不是List類型");
}
}

public static void main(String[] args){

List<String> list=new ArrayList<String>();
list.add("haha");
list.add("what?");
printType(list);
}
}

⑦ java怎麼得到泛型的類型

泛型,就是廣泛的類型。剛開始要用到哪個都不會知道。只有去實例化對象的時候才能確定。泛型的參數只能是對象類型。
你這個程序,T entity-entity就是是一個泛型的引用,你可以在構造方法中為其具體賦值.
例如:
private T entity;
public HibernateDao(T entity)
{this.entity=entity;}
HibernateDao<Strng> h=new HibernateDao<String>("哈哈");

這時,泛型就代表棗早一個String對象.值是哈哈.

在沒有泛型之前,這種坦核形式一般都是先定義一個通凳信雀用的Object obj.然後在構造方法中為其賦值.

⑧ Java中定義泛型<T>時,怎麼獲得泛型的類型

T.getClass()或者T.class都是非法的,因為T是泛型變數。
由於一個類的類型是什麼是在編譯期處理的,故不能在運行時直接在Base里得到T的實際類型。
有一種變通的實現方式:
import java.lang.reflect.Array;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class Generic extends Base<String> {
public static void main(String[] args) {
Generic c = new Generic();
System.out.println(c.array);
}

Object array ;
public Generic() {
array = Array.newInstance(getGenericType(0), 100);
}
}

class Base<T> {
public Class getGenericType(int index) {
Type genType = getClass().getGenericSuperclass();
if (!(genType instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
if (index >= params.length || index < 0) {
throw new RuntimeException("Index outof bounds");
}
if (!(params[index] instanceof Class)) {
return Object.class;
}
return (Class) params[index];
}
}
其中Base<T>是泛型類,在父類中聲明getGenericType,子類繼承具體的Base<String>,那麼在子類中就可以通過getGenericType(0)獲取到String的class.

閱讀全文

與如何知道一個java對象的泛型類型相關的資料

熱點內容
專題學習網站源碼 瀏覽:163
jsphead什麼 瀏覽:88
gps串口數據怎麼發送 瀏覽:968
win10文件主頁共享查看 瀏覽:411
中國聯通有哪些app是免流的 瀏覽:176
邊做邊保存的文件找不到了 瀏覽:858
win10照片應用文件夾名稱 瀏覽:966
編程如何解決資金的原子性 瀏覽:638
如何製作廣角鏡頭矯正文件 瀏覽:513
在網頁開發中應該選用哪個資料庫 瀏覽:742
iphone5移動卡貼 瀏覽:990
電腦文件的格式 瀏覽:127
extjs的xtype 瀏覽:959
suse11iso文件要u盤安裝 瀏覽:153
如何將報表統計數據轉化為圖形 瀏覽:444
如何寄快遞材料文件 瀏覽:265
java構造方法private 瀏覽:475
手機文件找回恢復 瀏覽:516
word怎麼把u盤里的文件拔掉 瀏覽:976
港版蘋果用的插排 瀏覽:1000

友情鏈接