java中的动态方法返回类型

k3fezbri  于 2021-07-05  发布在  Java
关注(0)|答案(3)|浏览(522)

下面的代码正是我所希望的,但是我很好奇是否有更好的方法。如果接口允许静态方法,或者如果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;
    }
}
z9zf31ra

z9zf31ra1#

是的,有更好的办法。使用接口:

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 );
}
wfsdck30

wfsdck302#

很难猜出您“到底想做什么”,但是我假设您有一个带有静态解析方法的tparsedclass,它用来自tdata示例的数据填充一个新的tparsedclass示例。
如果您认为需要某种接口标记来指示类可以解析的其他对象,那么为什么不将parse方法实现为非静态方法,用传递对象的数据填充“this”?
例如

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);
o2g1uqev

o2g1uqev3#

可以将tparsedclass定义为tparsedclass扩展了abstractclass,但class对象并不表示抽象类,它是通过反射引用类型定义的一种方式。

相关问题