2010-01-13 8 views
4

j'ai coursgénériques java et SuppressWarnings

abstract class A { 
    //.... 
} 

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

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

J'ai

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

implémentations pour la classe Maker

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

et fabrique de classe avec une méthode statique

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

Dans ce cas, je me avertissant que Maker est un type cru, quand je déclare Maker cette façon

Maker<?> maker = null; 

Je reçois exception (est de ne pas applicable pour les arguments A) sur

return maker.make(obj); 

Quelle est la meilleure façon de se débarrasser de ces avertissements sans en utilisant

@SuppressWarnings("unchecked") 

Répondre

5

Débarrassez-vous de tous génériques sur le Maker - vous n'avez pas besoin:

interface Maker { 
    SomeClass make(A obj); 
} 

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

Ou si vous voulez continuer à l'utiliser, allez avec un casting ou avec le SuppressWarnings dangereux.

Pour comprendre pourquoi vous obtenez une erreur si votre essayer de définir:

Maker<? extends A> maker = null; 

Imaginez le cas lorsque vous (par accident) Inscrivez-vous maker = new MakerForC(), et essayez d'appliquer à B.

+0

Ok, je pense que je vais avec suppressWarnings alors provoquer un vraiment envie d'éviter de lancer – vrm

+0

Marker! = Maker :) – BalusC

+0

yup. fixé cela. et a expliqué pourquoi l'erreur apparaît. – Bozho

-2

Si je comprends bien compris votre question, je pense que vous pouvez essayer de remplacer

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

par

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

n'a pas le tester, donc si vous avez d'autres erreurs maintenant, s'il vous plaît laissez-moi savoir.

+0

cela ne fonctionne pas. la méthode est statique. Si le type S est défini sur la méthode, cela ne fonctionne toujours pas. – Bozho

+0

Dans ce cas, je ne peux pas faire de référence statique au type non statique S – vrm

+0

ah oui, je vois ... Alors peut-être une solution est d'implémenter le modèle singleton au lieu d'utiliser des méthodes statiques? – Fortega