java中的动态方法返回类型

时间:2009-11-02 21:16:11

标签: java generics reflection methods

以下代码正是我想要的,但我很好奇是否有更好的方法来实现它。如果接口允许静态方法,或者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;
    }
}

3 个答案:

答案 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对象不代表抽象类,它是通过反射引用类型定义的一种方式。

相关问题