[英]Java: How to check generic class type definitions?
我們的想法是定義一個可以調用在derrived類中定義的方法的基類,但是在創建時我想確保這樣的方法完全根據需求定義,即方法只接受一個參數,一個HashMap <String String
>。
到目前為止,我能夠使用以下代碼檢查該方法是否只包含一個參數,並且它是Class HashMap,但是如何檢查泛型定義是否為<String, String
>?
public boolean isMethodParameterValid(final Method method) {
final Class<?>[] parameters = method.getParameterTypes();
return ((parameters.length == 1) && parameters[0].isAssignableFrom(HashMap.class));
}
實際上,存在類型擦除但它不適用於變量/字段 - 僅適用於類型params被擦除並被其上限替換的類的定義。
這意味着您可以實現所要求的。 以下是如何檢查方法的第一個參數的通用參數:
class Z
{
public void f(List<String> lst) { }
}
...
Method m = Z.class.getMethod("f", List.class);
Type t = m.getGenericParameterTypes()[0];
if(t instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) t;
System.out.println("Generic params of first argument: " + Arrays.toString(pt.getActualTypeArguments()));
}
你不能。 Java泛型類型由編譯器“擦除”,即HashMap<String, String>
在運行時變為HashMap
。 看到這個問題。
我真的不明白你想要做的目標。 我有一種感覺,應該可以通過仔細設計您的類層次結構來在編譯時檢查它。 但是如果沒有關於你想要解決的問題的更多細節,我無法幫助你。
如上所述,在運行時,您無法查看類型的通用部分。
您是否有理由在模板模式中定義抽象方法?
然后檢查將靜態完成。
protected abstract void process(HashMap<String, String>);
(還有理由要求HashMap只是Map嗎?)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.