以下代码正是我想要的,但我很好奇是否有更好的方法来实现它。如果接口允许静态方法,或者Java方法可以在C#中扩展/参数化,那么这将更加容易。
我宁愿将参数“Class<TParsedClass> c
”替换为“Class<AbstractClass> c
”。对我来说,“Class<AbstractClass>
”表示扩展某个抽象类的类,但显然这是错误的,因为当我使用该参数并按照我上面的描述使用它时,我会遇到编译器错误。
public <TData, TParsedClass> TParsedClass convert(TData data, Class<TParsedClass> c)
{
try
{
return (TParsedClass)c.getMethod("parse", data.getClass()).invoke(c, data);
}
catch(Exception e)
{
e.printStackTrace();
return null;
}
}
答案 0 :(得分:5)
是的,还有更好的方法。使用接口:
public interface Parser< TData, TParsedClass >
{
TParsedClass parse( TData data );
}
public class IntParser
implements Parser< String, Integer >
{
public Integer parse( String data )
{
return Integer.valueOf( data );
}
}
public <TData, TParsedData> TParsedData convert(
TData data,
Parser< TData, TParsedData > parser
)
{
return parser.parse( data );
}
答案 1 :(得分:0)
很难猜到你“确切想要做什么”,但我想你有一些带有静态解析方法的TParsedClass,它使用来自TData实例的数据填充新的TParsedClass实例。
如果您认为需要某种接口标记来指示类可以解析哪个其他对象,为什么不将parse方法实现为非静态方法,该方法使用传递的数据填充“this”对象
E.g。
public class A implements Parser<B> {
public void parse(B b) {
this.foo = b.foo;
this.bar = b.bar;
}
}
要进行转换,您可以执行以下操作:
A a = new A();
a.parse(b);
而不是
A a = A.parse(b);
答案 2 :(得分:0)
您可以定义TParsedClass,因为TParsedClass扩展了AbstractClass,但Class对象不代表抽象类,它是通过反射引用类型定义的一种方式。