Java 已经支持这个特性,你只需要使用它。如需入门,请阅读Sun的通配符教程。
你想要的是以下内容:
public List<? extends IObject> getObject(){
ArrayList<ConcreteObject> objects = new ArrayList<ConcreteObject>();
return objects;
}
或者,可以使用不安全的演员表:
public <T extends IObject> List<T> getObject(){
ArrayList<T> objects = (ArrayList<T>) new ArrayList<ConcreteObject>();
return objects;
}
…但是这种方法相当脆弱,当您尝试使用无效类型访问其元素时,会引发运行时异常(发出编译错误信号除外):
@SuppressWarnings("unchecked")
public <T extends IObject> List<T> getObject(){
ArrayList<T> objects = (ArrayList<T>) new ArrayList<ConcreteObject>();
objects.add(new ConcreteObject());
return objects;
}
…
List<OtherConcreteObject> objects = getObject(); // Works.
OtherConcreteObject obj = OtherConcreteObject.get(0); // Throws CCE.
这将在运行时导致以下结果ClassCastException
:“<code>ConcreteObject cannot be cast to OtherConcreteObject
”——这很糟糕,因为上面的代码应该会成功。
因此,您应该尽量避免使用这种方法。