2016-04-20 3 views
4

Ich lerne Generics.Ich habe den folgenden Code nur für die Praxis geschrieben. In diesem Code habe ich eine einzige generische Methode für die Addition von zwei Zahlen und Verkettung von zwei Strings nach den Werten erstellt, die durch den Methodenaufruf bereitgestellt werden, es sollte die Ganzzahl hinzufügen oder Strings verketten.Kann ich die Addition von Ganzzahlen und die Verkettung von Strings in einer einzigen generischen Methode erreichen?

class Kaushal28{ 

public <T> void add(T a, T b){ 

    //System.out.println(a+b); 

}  
} 
public class NewClass59 { 
    public static void main(String args[]){ 

     Kaushal28 k = new Kaushal28(); 
     k.add(5, 8); 
     k.add("5","8"); 
} 
} 

Ich bin nicht sicher, ob dies in einer einzigen Methode durchgeführt werden kann oder nicht. Wenn nicht, was kann die Lösung dieses Problems sein? Kann ich dies mit einer generischen Klasse erreichen?

+2

Nein, die '+' Operator:

<T> void something(Adder<T> adder, T a, T b) { System.out.println(adder.add(a, b)); } something(new StringAdder(), "Hello", "World"); something(new IntegerAdder(), 1, 2); 

oder natürlich funktioniert als mathematische Addition und String-Verkettung. Es kennt nur numerische Typen und den String-Typ. Es kennt kein ungebundenes 'T'. – Savior

+0

was kann ich dafür tun? –

+2

Haben Sie zwei Überladungen. –

Antwort

2

Sie können dies nicht als Gattungs Methode haben, aber Sie können eine generische strategy haben:

interface Adder<T> { T add(T a, T b); } 

und es dann für Streich- und Inte spezialisieren ger:

class StringAdder implements Adder<String> { 
    @Override public String add(String a, String b) { 
    return a + b; 
    } 
} 

class IntegerAdder implements Adder<Integer> { 
    @Override public Integer add(Integer a, Integer b) { 
    return a + b; 
    } 
} 

Sie dann diese in einem "single generische Methode" wie diese verwenden: nur

System.out.println(new StringAdder().add("Hello", "World")); 
System.out.println(new IntegerAdder().add(1, 2)); 
+0

natürlich können wir '(1 + 2)' verwenden, aber ich habe versucht, Generika zu implementieren. –

2

Nein ist es nicht möglich, eine allgemeine Methode zu haben, der alle Arten umfasst, so dass Sie die Methode überladen müssen, um die Zieltypen zu unterstützen, aber hier ist ein potentieller Start, die alle Numbers und CharSequence umfasst:

class Kaushal28 { 

    public Number add(Number a, Number b){ 
     return a.doubleValue() + b.doubleValue(); 
    } 

    public CharSequence add(CharSequence a, CharSequence b){ 
     StringBuilder sb = new StringBuilder(a.length() + b.length()); 
     return sb.append(a).append(b).toString(); 
    } 
} 
+0

Ihre erste Methode muss keine Generika verwenden. Das Ersetzen von "T" durch "Zahl" wäre äquivalent (vorausgesetzt, Sie verwenden keine explizite generische Einschränkung). –

+0

@Nicolas Filotto, das Überladen bedeutet, muss in zwei verschiedenen Typen wie String und Integer? –

+0

@AndyTurner das ist richtig, ich wollte sicherstellen, dass wir den gleichen Typ für beide Parameter hatten, aber mit einem Rückgabetyp Nummer macht es keinen Sinn –

Verwandte Themen