@SuppressWarnings для окончательного параметра типа - PullRequest
3 голосов
/ 18 октября 2010

Привет, ребята. В месте у меня есть метод с общим «VT extends String». Очевидно, это генерирует предупреждение: Параметр типа VT не должен быть ограничен конечным типом String. Окончательные типы не могут быть расширены в дальнейшем . Вы знаете, есть ли способ подавить это предупреждение (Eclipse)? Если вам интересно, откуда у меня это:

import java.util.ArrayList;
import java.util.List;

class A<T> {
T value;
B<? super T> b;

void method() {
    b.method(value,new ArrayList<T>());
}}

interface B<X> {
<VT extends X> VT method(VT p, List<VT> lst);
}

// works fine
class C implements B<Number> {
public <VT extends Number> VT method(final VT p, final List<VT> lst) {
    return p;
}}

// causes warning
class D implements B<String> {
public <VT extends String> VT method(final VT p, final List<VT> lst) {
    return p;
}}

// error: The type E must implement the inherited abstract method B<String>.method(VT, List<VT>)
class E implements B<String> {
@SuppressWarnings("unchecked")
public String method(final String p, final List<String> lst) {
    return p;
}}

Спасибо! Cristian

1 Ответ

2 голосов
/ 18 октября 2010

Ваш код не компилируется, но вот что-то похожее, и я полагаю, что вы хотите:

class A<T>{
    T value;
    B<? super T> b;
    void method(){
        b.method(value);
    }
}
interface B<X>{
    <VT extends X> VT method(VT p);
}
// works fine
class C implements B<Number>{
    public <VT extends Number> VT method(VT p){return p;}
}
// causes warning
class D implements B<String>{
    public <VT extends String> VT method(VT p){return p;}
}

Видя, что у вас нет выбора, чтобы сказать extends String здесь, я бы сказал, что это ошибка в Eclipse. Кроме того, Eclipse обычно может предложить соответствующий SuppressWarnings, но не здесь. (Еще один баг?)

Что вы можете сделать, это изменить тип возвращаемого значения и аргумента на String, а затем подавить (не относящееся к делу) предупреждение безопасности типа, которое оно вызывает:

// no warnings
class D implements B<String>{
    @SuppressWarnings("unchecked")
    public String method(String p){return p;}
}
...