呼び出し元が提供するヘルパー オブジェクトを使用して、任意のターゲット データ構造への読み込みをサポートする汎用構成ローダーを作成しようとしています。ヘルパーは、ローダーをデータ構造の知識から切り離すために使用され、メンバー値を前処理し、サブ構造を作成し、構造からメンバーを追加/削除するメソッドを使用します。
クラスと変数の宣言が与えられた場合:
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())
です。
私が理解できないのはcrtObject
、T
コンストラクターに渡されたヘルパー自体がHelper<T>
.
私が見ている唯一の代替手段はClass<T>
、コンストラクター引数として a を渡すことです。
どんな助けでも大歓迎です。