Это неуклюжая проблема.
Решение состоит в том, чтобы найти область, которая охватывает оба использования подстановочного знака, поместить переменную типа в нее, заменить подстановочные знаки ссылками на переменную типа, а затемсвяжите переменную типа.
В вашем случае кажется, что класс является необходимой областью действия.Итак:
public class Whatever<T> {
private List<T> list;
private Foo<T> baz;
public void bazToList() {
list.add(baz.bar());
}
public void listToBaz() {
baz.foo(list.get(1));
}
}
Проблема в том, что вы добавили переменную типа в класс.Теперь везде, где используется этот класс, любое упоминание его типа должно иметь привязку к типу (например, Whatever<String>
или Whatever<?>
).Это может быть невероятно раздражающим, если код, использующий класс, на самом деле не заботится о типе вещей, которые он хранит в своем списке.
Чтобы обойти это, вы можете создать универсальный класс-держатель.Что-то вроде:
public class Whatever {
private WhateverHolder<?> holder;
public void bazToList() {
holder.bazToList();
}
public void listToBaz() {
holder.listToBaz();
}
private static class WhateverHolder<T> {
private List<T> list;
private Foo<T> baz;
public void bazToList() {
list.add(baz.bar());
}
public void listToBaz() {
baz.foo(list.get(1));
}
}
}
Но это довольно уродливо.Вы вводите совершенно новый класс и накладные расходы на новый объект во время выполнения, просто чтобы обойти некоторые надоедливые обобщения.