Мою проблему можно резюмировать следующим фрагментом:
public interface TheClass<T> {
public void theMethod(T obj);
}
public class A {
private TheClass<?> instance;
public A(TheClass<?> instance) {
this.instance = instance;
}
public void doWork(Object target) {
instance.theMethod(target); // Won't compile!
// However, I know that the target can be passed to the
// method safely because its type matches.
}
}
Мой класс A
использует экземпляр TheClass
с неизвестным типом дженериков. Он имеет метод с целью, переданной как Object
, поскольку экземпляр TheClass
может быть параметризован любым классом.Однако компилятор не позволит мне передать цель таким образом, что нормально.
Что мне делать, чтобы обойти эту проблему?
Грязным решением является объявление экземпляра как TheClass super Object>
, который отлично работает, но семантически неверен...
Другое решение, которое я использовал ранее, состояло в том, чтобы объявить экземпляр как необработанный тип, просто TheClass
, но это плохая практика, поэтому я хочу исправить свою ошибку.
Решение
public class A {
private TheClass<Object> instance; // type enforced here
public A(TheClass<?> instance) {
this.instance = (TheClass<Object>) instance; // cast works fine
}
public void doWork(Object target) {
instance.theMethod(target);
}
}