Java中有反映局部變量類型的方法嗎?我知道你對此有信心 - Get generic type of java.util.List。不知道如何解決,例如:運行時局部變量的一般類型
public void foo(List<String> s){
//reflect s somehow to get String
}
甚至更普遍的:
public void foo<T>(List<T> s){
//reflect s somehow to get T
}
Java中有反映局部變量類型的方法嗎?我知道你對此有信心 - Get generic type of java.util.List。不知道如何解決,例如:運行時局部變量的一般類型
public void foo(List<String> s){
//reflect s somehow to get String
}
甚至更普遍的:
public void foo<T>(List<T> s){
//reflect s somehow to get T
}
Here是很好的教程,它展示瞭如何以及何時使用反射來讀取泛型。例如,從您的冷杉獲取字符串foo
方法
public void foo(List<String> s) {
// ..
}
您可以使用此代碼
class MyClass {
public static void foo(List<String> s) {
// ..
}
public static void main(String[] args) throws Exception {
Method method = MyClass.class.getMethod("foo", List.class);
Type[] genericParameterTypes = method.getGenericParameterTypes();
for (Type genericParameterType : genericParameterTypes) {
if (genericParameterType instanceof ParameterizedType) {
ParameterizedType aType = (ParameterizedType) genericParameterType;
Type[] parameterArgTypes = aType.getActualTypeArguments();
for (Type parameterArgType : parameterArgTypes) {
Class parameterArgClass = (Class) parameterArgType;
System.out.println("parameterArgClass = "
+ parameterArgClass);
}
}
}
}
}
輸出:parameterArgClass =類java.lang.String
這是可能的,因爲你的在源代碼中明確聲明List只能包含字符串。然而,在案件
public <T> void foo2(List<T> s){
//reflect s somehow to get T
}
T可以是任何東西,是因爲類型擦除是不可能的檢索提供精準的T類信息。
沒有。由於Java的Type Erasure,所有泛型在編譯過程中被剝離。
但是,您可以在列表中的元素上使用instanceOf
或getClass
以查看它們是否與特定類型匹配。
但是你仍然可以做在該領域同樣的事情,所以信息存儲在某處... – Bober02 2012-08-03 15:52:25
字段是不同的,因爲它們的確切泛型類型靜態存儲在類文件中。約翰是正確的:你不能這樣做。 – 2012-08-03 15:55:52
你到底想用s完成什麼?你能告訴我一個簡單的例子(僞代碼無關緊要) – 2012-08-03 16:00:59
有了泛型,你可以做一些類似於public void foo T>(List s),如果這就是你想要的 –
2012-08-03 16:02:56