我有一个通用类,我们称之为Parser<T>
。在主程序中,我想创建一个Parser
的实例,其中T
取决于输入参数(因为会有很多选项)。
例如,我有一个变量Class x = BigInteger.class
。这意味着我希望T
为BigInteger
。
是否有可能使用我的变量代替T
获取Parser<BigInteger>
?如果不是,你会怎么建议这样做?
P.S。我是Java的新手,也不是母语为英语的人,所以我理解这个问题可能非常愚蠢或者已经得到了回答,如果是这样的话,我很抱歉。
答案 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>