дженерики Java и SuppressWarnings - PullRequest
       50

дженерики Java и SuppressWarnings

4 голосов
/ 13 января 2010

У меня есть классы

abstract class A {
    //....
}

class B extends A {
    //....
}

class C extends A {
    //....
}

Тогда у меня есть

interface Maker<T extends A> {
    SomeClass make(T obj);
}

реализации для класса Maker

class MakerForB implements Maker<B> { /*... */ }
class MakerForC implements Maker<C> { /*... */ }

и класса Factory с одним статическим методом

class Factory {
    public static SomeClass makeSomeClass(A obj) {
        Maker maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

В этом случае я получаю предупреждение, что Maker является необработанным типом, когда я объявляю Maker таким образом

Maker<?> maker = null;

Я получаю исключение (make не применим для аргументов A) на

return maker.make(obj);

Как лучше всего избавиться от этих предупреждений без , используя

@SuppressWarnings("unchecked")

Ответы [ 2 ]

5 голосов
/ 13 января 2010

Избавьтесь от всех генериков на Maker - вам это не нужно:

interface Maker {
    SomeClass make(A obj);
}

class MakerForB implements Maker {
    SomeClass make(A obj);
}

Или, если вы все еще хотите его использовать, используйте небезопасный бросок или SuppressWarnings.

Чтобы понять, почему вы получаете ошибку, если попытаетесь определить:

Maker<? extends A> maker = null;

Представьте себе случай, когда вы (случайно) получили maker = new MakerForC(), и попробуйте применить его к B.

0 голосов
/ 13 января 2010

Если я правильно понял ваш вопрос, думаю, вы могли бы попробовать заменить

class Factory {
    public static SomeClass makeSomeClass(A obj) {
        Maker maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

от

class Factory<S extends A> {
    public static SomeClass makeSomeClass(S obj) {
        Maker<S> maker = null;
        if(obj instanceof B) maker = new MakerForB();
        /* ... */
        return maker.make(obj);
    }
}

не проверял, так что, если вы получаете другие ошибки сейчас, пожалуйста, дайте мне знать.

...