1

呼び出し元が提供するヘルパー オブジェクトを使用して、任意のターゲット データ構造への読み込みをサポートする汎用構成ローダーを作成しようとしています。ヘルパーは、ローダーをデータ構造の知識から切り離すために使用され、メンバー値を前処理し、サブ構造を作成し、構造からメンバーを追加/削除するメソッドを使用します。

クラスと変数の宣言が与えられた場合:

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

その目的は、オブジェクトを抽出する前にダミー構造を 1 つ作成しClass<T>、それを他のコードで使用して構造タイプを検証し、T引数 usingでヘルパー ビジター メソッドを呼び出すことhelper.configValue(qulnam,stcClass.cast(val),loc.toString())です。

私が理解できないのはcrtObjectTコンストラクターに渡されたヘルパー自体がHelper<T>.

私が見ている唯一の代替手段はClass<T>、コンストラクター引数として a を渡すことです。

どんな助けでも大歓迎です。

4

1 に答える 1