Вы можете сделать это, используя подстановочные знаки :
public static List<STriple> listTriples(List<? extends SResource> subjects){
//... do stuff
}
В новом объявлении используется ограниченный подстановочный знак , который говорит, что универсальным параметром будет либо SResource
, либо тип, расширяющий его.
В обмен на принятие List<>
таким способом «делать вещи» не может включать вставку в subjects
. Если вы просто читаете из subjects
в методе, то это изменение должно дать вам желаемые результаты.
РЕДАКТИРОВАТЬ : Чтобы понять, почему нужны символы подстановки, рассмотрите этот (недопустимый в Java) код:
List<String> strings = new ArrayList<String>();
List<Object> objList = string; // Not actually legal, even though string "is an" object
objList.add(new Integer(3)); // Oh no! We've put an Integer into an ArrayList<String>!
Это явно не типично безопасно. Однако с открытками вы можете сделать это:
List<String> strings = new ArrayList<String>();
string.add("Hello");
List<? extends Object> objList = strings; // Works!
objList.add(new Integer(3)); // Compile-time error due to the wildcard restriction