В контексте статических методов, я хотел бы узкого ссылочного типа и вызывать более конкретный метод для объекта, например так:вызвать метод параметр, ограничен типом пересечения
public static <T, L extends List<? extends T> & RandomAccess> void do(L list) {
// Do some stuff
}
public static <T> void do(Iterable<? extends T> iterable) {
if(iterable instanceof List && iterable instanceof RandomAccess)
// invoke do(List&RandomAccess) method
else
// do something else
}
Так что я хотел бы знать, если есть синтаксис позволяет называть делать (Iterable) скорее, с помощью какого-то хака, как это:
private static <L extends List<? extends T> & Comparable> L cast(Iterable<? extends T> iterable) {
return (L) iterable;
}
public static <T> void do(Iterable<? extends T> iterable) {
if(iterable instanceof List && iterable instanceof RandomAccess)
do(cast(iterable));
else
// do something else
Примечания: Я знаю, что это не возможно, чтобы бросить мою итерацию этого пути
do((List<? extends T> & RandomAccess) iterable);
и швы мне, что стирание L в
L extends List<? extends T> & Comparable
является
List<? extends T>
Так почему я не могу вызвать метод этот путь?
do((List<? extends T>) iterable); // Which results in invoking do(Iterable<? extends T)
ключевое слово 'do' для петель –
Конечно ... это просто пример ... –
Похоже,' и RandomAccess> 'может быть упрощено до' & RandomAccess> 'или' & RandomAccess> ', по крайней мере для этих подписей. –