[英]how can i determine the ACTUAL return type of a specific subclass of a generic superclass?
我確實知道我嘗試執行的操作實際上不是使用純Java才能實現的-僅當我查看調試信息時才有可能。 無論如何,我不會在沒有調試的情況下進行編譯,因為我的spring mvc的大部分將停止工作。
也就是說,我有以下情況:
一個通用超類:
包com.cinefms.apitester.springmvc.crawlers;
public class TestGenerics<T extends TestGenericsInterface> {
public T get() {
return null;
}
public T put(T t) {
return null;
}
}
及其子類:
package com.cinefms.apitester.springmvc.crawlers;
public class TestGenericsSub extends TestGenerics<TestGenericsImpl> {
}
里面的物體真的很簡單。
接口:
package com.cinefms.apitester.springmvc.crawlers;
public interface TestGenericsInterface {
}
它的實現:
package com.cinefms.apitester.springmvc.crawlers;
public class TestGenericsImpl implements TestGenericsInterface {
}
eclipse很好,弄清楚了TestGenericsSub.get()
應該返回一個TestGenericsImpl
的實例...即使沒有可用的源。
但是我如何在運行時自己弄清楚呢?
如果“ m”是方法“運行”,則
m.getGenericReturnType();
將返回“ T”(無用),而:
m.getReturnType();
給我“ TestGenericsInterface”(也無濟於事)。 我一直在看“ org.javaruntype”庫...但是我似乎無法弄清楚。
有人可以解釋嗎?
謝謝!
由於Java類型擦除( https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html ),這非常困難。 如果您絕對必須知道T的運行時類型,建議將類另存為屬性,然后提供一個吸氣劑。
public class MyGenericClass<T> {
private final Class<T> type;
public MyGenericClass(Class<T> type) {
this.type = type;
}
public Class<T> getMyType() {
return this.type;
}
}
否則,您可以嘗試以下操作:
(Class<T extends TestGenericsInterface>) ((TestGenerics) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
在代碼中,我更喜歡前一種解決方案。
您可以使用ClassMate實現:
TypeResolver typeResolver = new TypeResolver();
MemberResolver memberResolver = new MemberResolver(typeResolver);
ResolvedType resolvedType = typeResolver.resolve(TestGenericsSub.class);
ResolvedTypeWithMembers resolvedTypeWithMembers = memberResolver.resolve(resolvedType, null, null);
ResolvedMethod resolvedGetMethod = resolvedTypeWithMembers.getMemberMethods()[0];
System.out.println(resolvedGetMethod.getReturnType()); // TestGenericsImpl
TypeTools是另一種選擇:
Class<?> t = TypeResolver.resolveRawArgument(TestGenerics.class, TestGenericsSub.class);
結果是預期的:
assert t == TestGenericsImpl.class;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.