簡體   English   中英

Java:如何檢查泛型類的定義?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM