代码之家  ›  专栏  ›  技术社区  ›  jdc0589

Java中动态方法返回类型

  •  1
  • jdc0589  · 技术社区  · 16 年前

    下面的代码正是我所希望的,但我很好奇是否有更好的方法来实现它。如果接口允许静态方法,或者如果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 回复  |  直到 16 年前
        1
  •  5
  •   Alexander Pogrebnyak    16 年前

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

    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 );
    }
    
        2
  •  0
  •   jarnbjo    16 年前

    很难猜测您“到底想做什么”,但我想您有一种带有静态解析方法的TparsedClass,它用来自Tdata实例的数据填充一个新的TparsedClass实例。

    如果您认为需要某种接口标记来指示一个类可以解析哪个对象,那么为什么不将解析方法作为非静态方法来实现,它用传递的对象的数据填充这个“?”。

    例如。

    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);
    
        3
  •  0
  •   Yishai    16 年前

    您可以将TParsedClass定义为TParsedClass扩展AbstractClass,但是类对象不表示抽象类,它是通过反射引用类型定义的方式。