簡體   English   中英

具有相同類型的靜態嵌套類的泛型類

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

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