2016-07-30 5 views
0

Ich habe eine String-ähnliche Klasse myString. Zu seinen Methoden möchte ich generische Typen T übergeben, wobei T entweder eine Zeichenkette oder ein Objekt von myString sein kann. Was ich bisher getan haben, um die Methoden der String-Klasse legen, das ich (wie charAt(), size()) verwenden, um in einer Schnittstelle myInterface, und so etwas wie folgt geschrieben:Generische Methoden, denen ich übergeben kann String-Parameter

class myString implements myInterface{  
    public <T extends myInterface> void mymethod(
     T inputString){ 
    } 
} 

Was ich will, ist, dass inputString sein kann entweder ein String oder ein myString Objekt.

Allerdings bekomme ich einen Fehler, der String is not a valid type for T sagt.

Was mache ich falsch?

PS: Dies ist meine erste Frage zu Stack, also pl. bleib bei mir.

+0

'String' implementiert nicht Ihre Schnittstelle' myInterface', also wird 'myInterface' nicht als polymorpher Typ für' String' funktionieren. "String" implementiert jedoch eine Schnittstelle namens "CharSequence" (https://docs.oracle.com/javase/7/docs/api/java/lang/CharSequence.html). Vielleicht solltest du das stattdessen verwenden. – khelwood

+0

Danke euch allen. Ich habe versucht, alle Antworten und Kommentare zu akzeptieren, da sie mir alle neue Informationen gegeben haben, die das Problem gelöst haben; Ich konnte jedoch nur eine Antwort akzeptieren. Daher habe ich den einen an der Spitze akzeptiert. – vksd

+0

Richtig, Sie können nur eine Antwort akzeptieren. Aber Sie können alle aufwerten. :) – ajb

Antwort

2

Sie sollten java.lang.CharSequence Schnittstelle anstelle von MyInterface verwenden, um Ihre eigene String-Klasse zu definieren. Und Ihre Methode Referenz sollte der generische Typ sein:

public <T extends CharSequence> void mymethod(T inputString) { 
    ... 
} 

BTW, CharSequence nicht size() Methode hat, so sollten Sie length() stattdessen verwenden.

Siehe

0

String Klasse nicht implementieren myInterface, so dass Sie kein Objekt vom Typ String an Methode mymethod übergeben können. Weil Sie diese Einschränkung setzen <T extends myInterface>. Sie können diese Methode also nur mit Objekten aufrufen, die myInterface erweitern.

0

Es gibt keine Möglichkeit in Java zu tun genau das, was Sie wollen. In Java können Sie sagen, dass ein generischer Parameter zu einer bestimmten Oberklasse gehören muss, aber das ist die einzige Art von Einschränkung, die Sie ihm geben können (anders als , die nicht häufig verwendet wird und Ihnen hier nicht helfen wird). In Ihrem Fall müssten Sie eine Klasse finden, die sowohl String als auch myString Unterklassen von sind, oder eine Schnittstelle, die beide implementieren. Wenn Ihre Methode charAt() und length() [nicht size()] verwenden muss, muss die gemeinsame Klasse oder Schnittstelle diese Methoden definieren.

In Ihrem Fall würde ich vorschlagen, dass Sie Ihre myString Klasse implementieren CharSequence.String implementiert auch CharSequence, so würden Sie in der Lage sein public <T extends CharSequence> myMethod(...) zu sagen. Ihre Methode wäre dann in der Lage, jede Methode zu verwenden, die in CharSequence definiert ist, einschließlich charAt() und length(). Es ist jedoch nicht möglich, andere Methoden zu verwenden, auch wenn sie sowohl für String als auch für myString definiert sind.

Ich glaube, es gibt dynamische Sprachen, in denen Sie definieren können eine Methode, die jede Klasse annehmen kann, solange die Klasse die Operationen unterstützt, die Sie sagen, dass Sie brauchen. Wenn ich mich nicht irre, wird dies Ente tippen genannt.Ich bin jedoch kein Experte in dieser Art von Sprache, aber ich weiß, dass Java nicht einer von ihnen ist.

Verwandte Themen