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将比 of 的类更宽aRule(它可能包括F不是 的类的子类的其他子类aRule)。

但是,您不能直接创建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 回答