1

こんにちは私は、型が抽象パラメーター化クラスであるパラメーターを受け取るジェネリックメソッドを作成しようとしています。メソッド内では、抽象クラスをインスタンス化できないため、渡されたパラメーターのインスタンスを抽象型のサブクラスとして作成します。

しかし、私はいくつかの問題を抱えています。そして、エラーメッセージは、RuleTypeをとにかく驚くことではないタイプに解決できないことを示していますが、これをどのように達成できるかわかりません。私の現在のコードは以下の通りです。

private <F extends AbstractRule<T>, T> void applyRyle(F cRule,ArrayList<T> aFeatures)
{

    Class RuleType = cRule.getClass();


    // if the parameter passed is a subclass of AbstractRule create some objects
    if(!RuleType.getSuperclass().getName().equals("AbstractRule"))
    {
        ArrayList<RuleType<T>> aRules = new ArrayList<RuleType<T>>();
        for(int i = 0; i < 10; i++)
        {

            RuleType<T> aRule= new RuleType<T(pattern.getMatrices().size(), 2,aFeatures);
            aRule.initialise(aRule.getMaxLocalLevel());
            aRules.add(aRule);
        }
    }
4

2 に答える 2

2

これのいくつかは、リフレクションを使用して実行できます。

private <F extends AbstractRule<T>, T> void applyRyle(F cRule, ArrayList<T> aFeatures)
{
     Class<? extends F> ruleType = cRule.getClass();
     // if the parameter passed is a subclass of AbstractRule create some objects
     if(! ruleType.getSuperclass().getName().equals("AbstractRule"))
     {
         ArrayList<? extends F> aRules = new ArrayList<? extends F>();
         for(int i = 0; i < 10; i++)
         {
             F aRule =
                 ruleType
                     .getConstructor(int.class, int.class, ArrayList.class)
                     .newInstance(pattern.getMatrices().size(), 2, aFeatures);
             aRule.initialise(aRule.getMaxLocalLevel());
             aRules.add(aRule);
         }
     }

それはおそらくあなたが本当に望んでいることを達成するための最良の方法ではありませんが。

于 2012-09-11T19:11:08.790 に答える
2

まず、次の行は必要ありません。一般的な宣言では、cRuleがのインスタンスになることが保証されているためですAbstractRule

if (!RuleType.getSuperclass().getName().equals("AbstractRule"))

実行時に上記をチェックする通常のより良い方法は、instanceof

if (!cRule instanceof AbstractRule)

あなたのArrayList宣言に関しては、あなたはただ次のことをすることができます:

ArrayList<F<T>> aRules = new ArrayList<F<T>>();

ただし、これFは実際のソリッドクラスの。と同じではないことに注意してくださいaRuleFメソッドが呼び出されたタイプになります。つまり、Fのクラ​​スよりも幅が広くなります(のクラスのサブクラスではないaRule他のサブクラスが含まれる場合があります)。FaRule

ただし、の新しいインスタンスを直接作成することはできませんF。代わりに、それを実行するデリゲートメソッドが必要です。つまり、を書くことはできませんnew F()。ただし、(の具体的なインスタンスがすでにあるので)できることは、それ自体の新しいインスタンスを作成できるF抽象的なメソッドを追加することです。AbstractRule

public interface AbstractRule<T extends AbstractRule> {
    T newRule(some parameters you need in the constructor);
}

今、私たちは書くことができます:

F newRule = aRule.newRule(pattern.getMatrices().size(), 2,aFeatures);
于 2012-09-11T19:14:00.290 に答える