3

ある場所には、一般的な「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;
}}
4

1 に答える 1

2

あなたのコードはコンパイルされませんが、ここに似たようなものがあります。

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;}
}
于 2010-10-18T07:23:23.283 に答える