Обобщения и приведение к правильному типу

Мою проблему можно резюмировать следующим фрагментом:

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, который отлично работает, но семантически неверен...

Другое решение, которое я использовал ранее, состояло в том, чтобы объявить экземпляр как необработанный тип, просто 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); 
    }
}
5
задан Aurelien Ribon 20 March 2012 в 10:28
поделиться