[英]Generic Class with Static Nested Class of the Same Type
我正在嘗試編寫一個通用配置加載程序,該加載程序支持通過使用調用方提供的幫助程序對象將其加載到任何目標數據結構中。 該幫助程序用於使加載程序脫離數據結構的任何知識,並帶有預處理成員值,創建子結構以及從結構中添加/刪除成員的方法。
給定類和變量聲明:
public class ConfigLoader<T extends Object>
...
private final Class<T> stcClass;
和靜態嵌套接口:
static public interface Helper<T>
{
public Object configValue(String qulfld , String loc);
public Object configValue(String qulfld, T val, String loc);
public Object configValue(String qulfld, String val, String loc);
public Object configValue(String qulfld, Boolean val, String loc);
public Object configValue(String qulfld, Number val, String loc);
public T crtObject();
public void addMember(T tgt, String fld, Object val);
public void rmvMember(T tgt, String fld);
}
和基本構造函數:
private ConfigLoader(JsonParser psr, Helper<T> hlp, DataStruct vld) {
super();
parser =psr;
helper =hlp;
stcClass =helper.crtObject().getClass(); // <== error here
validation =vld;
errors =new ArrayList<Fail>();
}
我在指示的構造函數行中收到編譯器錯誤:
ConfigLoader.java:79: error: incompatible types
stcClass =helper.crtObject().getClass();
^
required: Class<T>
found: Class<CAP#1>
where T is a type-variable:
T extends Object declared in class ConfigLoader
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object
1 error
目的是預先創建一個虛擬結構,從中提取Class<T>
對象,然后將其用於其他代碼中以驗證結構類型,然后使用helper.configValue(qulnam,stcClass.cast(val),loc.toString())
調用帶有T
參數的輔助訪問者方法。 helper.configValue(qulnam,stcClass.cast(val),loc.toString())
。
我無法弄清楚的是,為什么編譯器無法驗證幫助程序的crtObject
方法的返回實際上是一個T
對象,因為傳遞給構造函數的Helper<T>
程序本身就是Helper<T>
。
我看到的唯一替代方法是將Class<T>
作為構造函數參數傳遞。
任何幫助,將不勝感激。
您可以將stctype
的類型聲明為<? extends T>
<? extends T>
。
private final Class<? extends T> stcType;
這將確保stctype
能夠處理T
或任何子T
。
為了擺脫編譯器錯誤,您現在可以安全地helper.crtObject().getClass();
到Class<? extends T>
Class<? extends T>
如下:
stcClass = (Class<? extends T>) helper.crtObject().getClass();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.