引用内部泛型类型

时间:2019-01-25 11:05:21

标签: java generics

是否可以提取内部泛型类型?

想象一下以下课程:

interface Animal { }

class Bear implements Animal { }

class AnimalRule<ANIMAL extends Animal> { }

class BearRule extends AnimalRule<Bear> { }

现在,我想为此代码编写测试,但是我想拥有一个通用的基础测试类。

我可以这样声明:

class AnimalRuleAltTest<ANIMAL extends Animal, RULE extends AnimalRule<ANIMAL>> {
  RULE rule;
  ANIMAL animal;
}

class BearRuleAltTest extends AnimalRuleAltTest<Bear, BearRule> { }

但是我必须同时传递BearBearRule,这似乎是多余的,因为编译器肯定知道BearRule已经实现了AnimalRule< Bear { {1}}。


如果我仅提供规则类,是否有可能提取内部泛型类型?

类似这样的东西:

>

更新:为清楚起见,我问的是提取内部类/是否可以,而不是如何“修复”它。

2 个答案:

答案 0 :(得分:0)

尝试一下:

class AnimalRuleAltTest<ANIMAL extends Animal> {
    AnimalRule<ANIMAL> rule;
    ANIMAL animal;
}

class BearRuleAltTest extends AnimalRuleAltTest<Bear> { }

此外,将RULEAnimalRuleAltTest的所有AnimalRule<ANIMAL>替换为 setTimeout(function(){ if (document.querySelector(".one-rolled-popup").style.display == "block";) { document.querySelector(".one-rolled-popup").style.display= "none"; } else { document.querySelector(".one-rolled-popup").style.display= "none"; } }, 3000);

答案 1 :(得分:0)

此代码段遵循与您完全相同的结构,从BearRuleTestBear

public static void main(String...strings) throws Exception {

        final ParameterizedType bearRuleTestGenericSuperclass =
            (ParameterizedType) BearRuleTest.class.getGenericSuperclass();
        final Type type = bearRuleTestGenericSuperclass.getActualTypeArguments()[0];
        final ParameterizedType animalRuleGenericSuperclass =
            (ParameterizedType) Class.forName(type.getTypeName()).getGenericSuperclass();

        System.out.println(
            animalRuleGenericSuperclass.getActualTypeArguments()[0]
        );
    }

编辑:

  • 我首先得到您的ruleTest泛型超类,它是AnimalRuleTestAnimalRule
  • 然后我得到第一个参数,即BearRule
  • 我从类加载器中加载BearRule类,然后获取其genericSuperclass,它是带有通用参数的AnimalRule
  • 然后我选择第一个参数Bear