2017-10-11 3 views
-2

J'ai l'interface suivante.Comment générique générique comme paramètre

interface ITest<T extends Object>{ 
    List<T> getValues(); 
    Object getValueForKey(String key, T dataObject); 
} 

donc je veux l'utiliser dans une méthode statique comme:

static createTable(ITest<?> test){ 
    for(? dataObject: test.getValues()){ 
     Object value = test.getValueForKey("KEY", dataObject) 
    } 
} 

Ce qui amène l'erreur: « Les caractères génériques peuvent être utilisés que comme paramètres de référence »

et bien sûr c'est ne pas accepter un objet dans "getValueForKey()"

Quand j'utiliser cela comme:

ITest<Option> testImpl = new ITest<Option>(){ 
    @Override 
    List<Option> getValues(){ 
      new ArrayList<>(10); 
    } 
    ... 
} 

createTable(testImpl); 

Comment puis-je obtenir de rester précis dans mon implémentation d'interface spécifique, mais pas dans la méthode statique à l'aide de l'interface (le meilleur des cas: sans avertissement préalable de l'analyse syntaxique décochée/cast)

+0

Je ne comprends pas la question. Le ? wildcard signifie "je ne me soucie pas du type". En d'autres termes: "Je connais nada zip niente sur le type". Je ne comprends pas pourquoi vous voulez "aligner" cette non-connaissance avec "J'ai un type T spécifique connu". – GhostCat

+0

Qu'attendez-vous? dataObject' à faire? – Oleg

+0

Il est assez simple que la méthode statique soit utilisée avec beaucoup de types différents, et que je ne veuille pas l'implémenter à chaque fois car c'est beaucoup de code qui serait redondant –

Répondre

1

Vous devez utiliser un generic method.

static <T> void createTable(ITest<T> test) { 
    for (T dataObject : test.getValues()) { 
     Object value = data.getValueForKey("KEY", dataObject); 
    } 
} 

Lorsque vous utilisez ITest<?> test vous simplement déclarer que votre paramètre peut être de tout type, vous ne pouvez pas utiliser ? comme dataObject de type plus tard. Lorsque vous déclarez une méthode générique, vous pouvez utiliser T comme type. Il va être déduit au moment de la compilation et parce que vous l'appelez avec ITest<Option> testImplT va être Option.

Vous ne devriez pas faire aussi <T extends Object> c'est une limite complètement inutile et est équivalent à seulement <T>.

0
public class MyClass { 
    static class ITest<T> { 
     T[] getValues() { 
      return null; 
     } 
    } 

    static <T extends Object> void createTable(ITest<T> test) { 
     for(T dataObject : test.getValues()) { 
      T value = dataObject; 
     } 
    } 
} 
+0

ne peut pas résoudre le symbole T EDIT: gentil aucune erreur de compilation. btw je n'ai pas downvote ;-) –

+0

Vous faites quelque chose de mal, le code suivant compile et s'exécute –

+0

Son un certain rager ne vous inquiétez pas, bon ce n'est pas vous –