2017-10-06 2 views
-1

Tout en suivant un cours Java, il m'a été demandé de convertir une classe régulière en une classe générique. Je pense que j'ai partiellement réussi, mais je peux trouver un moyen de l'obtenir à 100%.Java Generics non vérifié avertissement et la méthode ne peut pas être référencée à partir d'un contenu statique

public class ElementUtils { 
    public static <T> List transformedList(List<T> inList, Function<T, T> f) { 
     List<T> outList = new ArrayList<>(); 
     for (T s : inList) { 
      outList.add(f.apply(s)); 
     } 
     return outList; 
    } 
} 

test classe

public class Test { 
    public static void main(String[] args) { 
     List<String> lijst = Arrays.asList("Jan", "Jos", "Anna", "Pieter", "Johan"); 

     List<String> upCaseList = ElementUtils.transformedList(lijst, String::toUpperCase); 
     List<String> replaceList = ElementUtils.transformedList(lijst, s -> s.replace("i", "IETS")); 
     List<String> exclList = ElementUtils.transformedList(lijst, s -> s + "!"); 
     List<Integer> wordLengths = ElementUtils.transformedList(lijst, String::length); 

     System.out.println(upCaseList); 
     System.out.println(replaceList); 
     System.out.println(exclList); 
     System.out.println(wordLengths); 
    } 
} 

Lorsque je supprime la dernière instruction wordLengths cela fonctionne bien, mais jette un avertissement. Avec la dernière déclaration, il est dit que je ne peux pas référencer une méthode à partir d'un contenu statique.

Erreur:

Error:(13, 49) java: method transformedList in class cvo.ex2.ElementUtils cannot be applied to given types; 
    required: java.util.List<T>,java.util.function.Function<T,T> 
    found: java.util.List<java.lang.String>,String::length 
    reason: inference variable T has incompatible bounds 
    equality constraints: java.lang.String 
    lower bounds: java.lang.Integer 

Je ne comprends pas ce que je suis absent ici ... Merci pour votre aide.

+0

Quel est le message exact? – Stultuske

+0

OP mis à jour avec le message – DarkLite1

+0

cela pourrait être en mesure d'aider: https://stackoverflow.com/questions/27522741/incompatible-types-inference-variable-t-has-incompatible-bounds – Stultuske

Répondre

1

Vous fournissez le même type générique T pour l'entrée et la sortie. Vous avez besoin d'un type d'entrée T et d'un type de résultat R, et renvoyez également une liste de type R pour vous débarrasser de l'avertissement.

public static <T,R> List<T> transformedList(List<T> inList, Function<T, R> f) { 
    List<R> outList = new ArrayList<>(); 
    for (T s : inList) { 
     outList.add(f.apply(s)); 
    } 
    return outList; 
} 
+0

Merci, mais Intellij me dit 'ne peut pas résoudre le symbole T' lorsque je copie votre code pour tester. – DarkLite1

+0

@ DarkLite1 Il a introduit un nouveau type générique qui est faux. Vous voulez utiliser le type générique de 'T'. Mise à jour sa réponse. –

+0

Désolé, le type de résultat doit également être déclaré. J'ai mis à jour ma réponse. L'édition par Murat ne résout pas votre problème que votre type de sortie n'est pas toujours le même que votre type d'entrée (Chaîne dans les trois premiers exemples, Entier dans le quatrième) –

0

Fondamentalement < T> signifie un type mais dans un appel de méthode < T> doit être le même partout. Vous ne pouvez pas utiliser < T> une fois comme Integer, puis avec String dans la même invocation de méthode.

Dans cette ligne: Liste < T> outList = new ArrayList <>(); Qu'est-ce que < T> signifie depuis qu'une fois il a été Integer et une fois String dans le même appel. Java ne peut pas deviner;)