2010-10-18 22 views
3

Hé les gars. Dans un endroit, j'ai une méthode avec un générique "VT extends String". Évidemment cela génère un avertissement: Le paramètre de type VT ne doit pas être délimité par le type final String. Les types définitifs ne peuvent plus être étendus. Savez-vous s'il existe un moyen de supprimer cet avertissement (Eclipse)? Si vous vous demandez comment je dois avoir ceci:@SuppressWarnings pour le paramètre de type final

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; 
}} 

Merci! Cristian

+0

Je désactiver l'avertissement. –

+0

Je suppose que la seule façon de supprimer l'avertissement est '@SuppressWarnings (" all ")'. – Balder

Répondre

2

Votre code ne compile pas, mais est ici quelque chose de semblable, que je suppose est ce que vous voulez:

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;} 
} 

Voyant que vous n'avez pas le choix de dire extends String ici, je dire que c'est un bug dans Eclipse. En outre, Eclipse peut généralement suggérer un SuppressWarnings approprié, mais pas ici. (? Un autre bug)

Ce que vous pouvez faire est de changer le type de retour et des arguments pour String puis supprimer le (non pertinent) la sécurité de type avertissement provoque:

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

Désolé pour la non-compilation. Je viens de l'adapter rapidement à partir de mon code. Le type de retour dans B, C, D devrait être nul, mais cela n'affecte pas ma situation. Votre solution est intéressante et je l'utiliserais mais cela ne semble pas fonctionner. Si je fais cela, j'obtiendrai l'erreur: "D n'implémente pas la méthode". Semble une telle méthode n'a pas la même signature. –

+0

En fait, il compile bien. Mon mal à expliquer mon code. J'ai 2 paramètres à la méthode. C'est quand ça échoue. http://pastebin.com/RETLMnCj –

+1

Pouvez-vous mettre à jour votre code dans la question d'origine afin qu'il compile et fonctionne comme votre situation? Cependant, le paramètre type de 'B.method' est inutile ici (cela n'aurait de sens que si vous vous attendiez à retourner une valeur du même type que l'argument). Vous pourriez juste dire 'méthode vide (X x)' dans 'B'. Je vous recommande de supprimer les paramètres de type à 'method' si vous contrôlez ce code, plutôt que de faire des suppressions d'avertissement étranges. – gustafc