2016-10-25 10 views
1

I unten Methode in Java habenerhalten Java-Liste auf Basis der Eingabeparameter

public <T> List<?> getList(String str, Class<T> clazz){ 
    List<T> lst = new ArrayList<>(); 
    String[] arr = str.split(","); 
    for(String s : arr){ 
     lst.add(clazz.cast(s)); 
    } 
    return lst; 
} 

Ich möchte Ausgabe dieser Methode wie diese

List<Integer> lst = getList("1,2",Integer.class) 

List<String> lst = getList("ab,cfv",String.class) 
... 
... 
etc 

Aber Problem hier ist, wenn ich "1,2" bin vorbei und Integer.class, ich bekomme classCastException bei "clazz.cast(s)"

können Sie vorschlagen, was ich hier falsch mache

+0

Sie sind nicht garantiert, dass 'String s' gegossen werden kann Geben Sie "T" ein. Wie würde 'List sockets = getList (" asdf ", Socket.class);' Arbeit? – bradimus

+0

Danke .. für String, es funktioniert – vijendra

+0

Nicht überraschend. Sie können eine 'Zeichenfolge' ohne Probleme in eine' Zeichenfolge' umwandeln. – bradimus

Antwort

2

Ihr Problem mit der Tatsache zusammen, dass Sie versuchen, ein String in ein Integer zu werfen, die nicht arbeiten können, da String keine Unterklasse von Integer ist, sollten Sie ein Function sorgen, dass Ihre String in den Zieltyp konvertiert wird stattdessen als next:

public <T> List<T> getList(String str, Function<String, T> parser){ 
    return Arrays.stream(str.split(",")).map(parser).collect(Collectors.toList()); 
} 

Beispiel:

List<Integer> lst = getList("1,2", Integer::valueOf); 
System.out.println(lst); 

Output:

[1, 2] 

Der vorherige Code arbeitet mit Java 8 und oben, die für frühere Versionen, die Logik ist die gleiche, müssen Sie einfach FluentIterable von Google Guava verwenden die Stream und Verwendung ersetzen com.google.common.base.Function statt java.util.function.Function das Ergebnis ist die folgende:

public <T> List<T> getList(String str, Function<String, T> parser){ 
    return FluentIterable.from(Arrays.asList(str.split(","))).transform(parser).toList(); 
} 

Beispiel:

List<Integer> lst = getList(
    "1,2", 
    new Function<String, Integer>() { 
     public Integer apply(final String input) { 
      return Integer.valueOf(input); 
     } 
    } 
); 

Output:

[1, 2] 
+0

danke :) lass mich überprüfen – vijendra

+0

danke für Ihre Mühe, andere Weise? – vijendra

+0

ja, ich habe 1.7 – vijendra

0

Integer und String sind nicht in derselben Hierarchie. Sie stammen beide aus dem Objekt, aber verzweigen sich auf verschiedene Arten. Sie könnten tun, wie die andere Antwort sagt oder den Parameter String in Objekt ändern.

 Object 
    / \ 
    /  \ 
String  Integer 
0

Eine andere Möglichkeit ist ICaster Schnittstelle zu erstellen:

public interface ICaster<T> { 
    T cast(String a); 
} 

und ihre Implementierungen z:

public class IntegerCaster implements ICaster<Integer> { 
    @Override 
    public Integer cast(String a) { 
     return Integer.parseInt(a); 
    } 
} 

Dann statt Class<T> clazz Parameter in getList Methode, sollten Sie ICaster<T> caster verwenden.Hier

ist neu getList Methode:

public static <T> List<?> getList(String str, ICaster<T> caster){ 

    List<T> lst = new ArrayList<>(); 

    String[] arr = str.split(","); 
    for(String s : arr){ 
     lst.add(caster.cast(s)); 
    } 

    return lst; 
} 

Und Verwendungsbeispiel:

List<Integer> lst = (List<Integer>) getList("1,2",new IntegerCaster()); 

Die Ausgabe sollte: [1, 2]

Verwandte Themen