Java уже поддерживает эту функцию, вам просто нужно ее использовать. Для начинающего читайте учебник Wildcards от 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
во время выполнения: «ConcreteObject
не может быть приведен к OtherConcreteObject
», что довольно плохо, потому что, поскольку код стоит выше, он должен завершиться успешно.
По этой причине вам следует избегать этого метода.