2012-03-30 3 views
-1

Ich möchte eine Klasse-Instanz zu einer Methode eines anderen übergeben und sicher sein, dass es die erforderliche Schnittstelle implementiert. Der Code ist so etwas wie diesesWie übergibt man eine Instanz an eine Klasse, die eine Schnittstelle implementieren und dann in Java verwenden muss?

public interface MyInterface{ 
    someMethod(); 
} 

public class A implements MyInterface{ 
    B bInst; 
    public someMethod(){ 
     //stuff 
    } 

    public bar(){ 
     bInst = new B(this); // [4] 
    } 
} 

public class B{ 

    private MyInterface x;  //[1] 

    // here i don't want to use 
    void B(MyInterface y){  // [2] 
     this.x=y;   // [3] 
    } 

    private void foo(){ 
     x.someMethod(); 
    } 

} 

Ich versuchte subsituting "MyInterface" in [1] und [2] "Class <? Erweitert IBtBytesReciever>" aber Compiler geben Sie mir Fehler oder in [2] oder in [3 ].

Wie kann ich meine Idee am besten umsetzen?

HINWEIS: Ich möchte nicht direkt Klasse A verwenden, da der Klasse B müssen nicht den genauen Namen der Klasse kennen, und es muss mit verschiedenen Klassen

EDIT wiederverwendbar sein: Der Fehler ist auf [ 4]

constructor B(class A) not defined 
+1

Was magst du nicht an 'void B (MyInterface y)'? Es scheint genau das zu tun, was du sagst .. –

+1

Was ist die Fehlermeldung, die Sie bekommen? – ControlAltDel

+0

Was ist der Compilerfehler? – Kashyap

Antwort

4

Es ist nicht wirklich klar, was Sie unter „hier möchte ich nicht verwenden“, aber im Grunde Konstruktor nicht richtig geschrieben wird. Es sollte einfach sein:

// Or make it non-public if you want, of course. 
public B(MyInterface y) { 
    this.x = y; 
} 

Das wird tun genau was Sie wollen: etwas verhindern, die nicht die Schnittstelle von nicht implementiert an den Konstruktor übergeben wird. Warum möchten Sie es generisch machen oder stattdessen eine Klassenreferenz übergeben?

Sie könnte es ändern:

public B(Class<? extends MyInterface> clazz) { 
    // TODO: catch or declare all the various exceptions this could throw 
    this.x = clazz.newInstance(); 
} 

... aber es fühlt sich ziemlich umständlich zu tun.

EDIT: Nur um es klar zu machen, ist es absolut fein zu rufen new B(this). Kurz, aber vollständiges Beispiel, indem Sie den Code als Starter:

interface MyInterface{ 
    void someMethod(); 
} 

class A implements MyInterface{ 
    B bInst; 
    public void someMethod(){ 
    } 

    public void bar() { 
     bInst = new B(this); 
    } 
} 

class B { 
    private MyInterface x; 

    B(MyInterface y) { 
     this.x=y; 
    } 

    private void foo(){ 
     x.someMethod(); 
    }  
} 

Die absolut in Ordnung arbeiten werden.

+0

meine Idee eine Instanz bereits initialisiert – Zorb

+0

@Zorb passieren war: Also das ist in Ordnung - Sie denselben Verweis auf das 'B' Konstruktor übergeben können mehr Male ... es ist wirklich nicht klar, was der erste Ansatz * nicht * erreichen, dass Sie wollen ... –

+0

das Problem ist in Tannen Art und Weise kann ich nicht nennen „Binst = new B (this);“ weil der Konstruktor für MyInterface und nicht für die Klasse I aus – Zorb

3

Ich habe versucht, "MyInterface" in [1] und [2] "Class <? Erweitert IBtBytesReciever>"

das ist dein Fehler subsituting. Class<? extends IBtBytesReciever> beschreibt den Typ Klassenobjekt, die Sie für die Reflexion benötigen, aber Sie sollten es hier nicht benötigen.

Der Unterschied zwischen einem Klassenobjekt und einer Klasseninstanz ist wie der Unterschied zwischen einem Wikipediaeintrag über Elefanten und einem bestimmten Elefanten. Der Wikipedia-Eintrag enthält Metadaten über Elefanten im Allgemeinen, aber wenn Sie eine Operation auf einem Elefanten durchführen möchten, benötigen Sie in den meisten Fällen einen tatsächlichen Elefanten.

In einem Verfahren wie folgt aus:

void foo(MyInterface instance) 
{ 

} 

Sie foo() mit jeder gültigen Instanz einer Klasse aufrufen können, die MyInterface implementiert.

Verwandte Themen