Java:有没有办法自动转换返回值?

时间:2011-01-20 08:35:04

标签: java inheritance types

我有两个班级:

public abstract class Arguments {
    public List execute() {
        // do some stuff and return a list
    }
}

// and a child :
public class ItemArguments {
    public List<Item> execute() {
        return super.execute();
    }
}

正如您所看到的,ItemArguments中的execute方法有点无用,但如果没有它,我必须将所有调用转换为Arguments中的execute方法。

有没有办法删除ItemArguments中的execute方法,并避免在进行调用的地方进行强制转换?

感谢您的帮助!

1 个答案:

答案 0 :(得分:10)

泛型

public abstract class Arguments<T> {
  public List<T> execute() {
    // some stuff
    return new ArrayList<T>();
  }
}

public class ItemArguments extends Arguments<Item> {

}

除非您有其他理由,否则您甚至不需要子类

public class Arguments<T> {
  public List<T> execute() {
    // blah
  }
}

Arguments<Item> o1 = new Arguments<Item>();
List<Item> o2 = o1.execute();

在T上调用方法并不是那么简单。 T由编译器擦除,因此在运行时不可用。一个易于理解的解决方法是在实例化Arguments时传入类

public class Foo {
  public static void something() { ... }
}

public class Arguments<T extends Foo> {
  private Class<? extends Foo> foo;
  public Arguments(Class<? extends Foo> foo) {
    this.foo = foo;
  }
  public List<T> execute() {
    foo.something();

  }
}

有更好的方法,但如果不是模式大师,这几乎是可以理解的:)