有没有办法在泛型类中创建匹配T参数的变量?

时间:2018-04-14 22:37:14

标签: java generics

我有一个通用类,我们称之为Parser<T>。在主程序中,我想创建一个Parser的实例,其中T取决于输入参数(因为会有很多选项)。 例如,我有一个变量Class x = BigInteger.class。这意味着我希望TBigInteger

是否有可能使用我的变量代替T获取Parser<BigInteger>?如果不是,你会怎么建议这样做?

P.S。我是Java的新手,也不是母语为英语的人,所以我理解这个问题可能非常愚蠢或者已经得到了回答,如果是这样的话,我很抱歉。

2 个答案:

答案 0 :(得分:0)

没有好方法可以做到这一点。显式或推断类型参数必须是静态(编译时)类型。

听起来,使用Class作为参数的非泛型类型可能会更好。

如果你坚持使用泛型,你可能会得到一些丑陋的东西,比如:

 if (class.getName().equals("java.lang.BigInteger")) {
     BigInteger i = new Parser<BigInteger>().parse(someString);
     // do something with 'i'
 } else if (...) {
     // ad nauseum
 }

使用parse方法而不是类的类型参数也可能会更好; e.g。

 class Parser {
    <T> parse(Class<T> expected, String input) {
       // do parsing of input
       if (expected.isInstance(result)) {
           return expected.cast(result) {
       } else {
           // throw some exception
       }
 }

但是即使这样,如果要使用返回类型,调用者也需要对每个案例进行单独的静态调用; e.g。

if (class.getName().equals("java.lang.BigInteger")) {
     BigInteger i = parser.parse(BigInteger.class, someString);
     // do something with 'i'
 } else if (...) {
     // ad nauseum
 }

答案 1 :(得分:0)

您应该将变量传递给构造函数。

public class Parser<T> {

    final Class<T> clazz;

    public Parser(Class<T> clazz) {
        this.clazz = clazz;
    }

    @Override
    public String toString() {
        return "Parser<" + clazz.getSimpleName() + ">";
    }
}

Class a = BigInteger.class;
Parser parser1 = new Parser(a);
System.out.println(parser1);

Class b = String.class;
Parser parser2 = new Parser(b);
System.out.println(parser2);

- &GT;

Parser<BigInteger>
Parser<String>