2017-05-22 4 views
0

ich einen konkreten Typ haben, Unterklasse muss die Typen aus dem Netty Rahmen erstreckt:Injizieren konkrete Klasse im Frühjahr, die einen Rahmen Typ

public class ServerHandlerImpl extends ChannelInboundHandlerAdapter implements ServerHandler 

ChannelInboundHandlerAdapter implementiert ChannelInboundHandler

Wenn ich schaffen ServerHandlerImpl, möchte ich Verwenden Sie Spring, um es zu injizieren. Ich weiß, dass ich den Betontyp verwenden kann. Aber ich war mir nicht sicher, ob es eine Möglichkeit gab, von der Schnittstelle zu injizieren.

ServerHandler Schnittstelle jetzt leer ist:

public interface ServerHandler { 
} 

Wenn ich versuche, den Typ von der Schnittstelle zu injizieren,

@Autowired 
private ServerHandler serverHandler; 

@Override 
protected void initChannel(Channel ch) throws Exception { 
    pipeline.addLast(serverHandler); 
} 

Es wird nicht kompiliert, da die addlast ist für einen Typ, der Geräte suchen ChannelInboundHandler, was mein konkreter Typ tut, aber die Schnittstelle nicht. Was machen Menschen in diesen Situationen?

+0

Dies ist, weil die Java-Proxies funktionieren ... Sie können zum Beispiel einen Service erstellen, um ChannelInboundHandlerAdapter-Instanzen (ChannelInboundService) zu speichern, diesen Dienst überall automatisch ansteuern, wenn Sie ihn benötigen, und die Referenz channelInboundHandlerAdapter abrufen. – Dani

Antwort

0

Nun, das hat nichts mit Spring sondern mit Java und OO Programmierung zu tun.

Sie deklarieren ein Objekt vom Typ ServerHandler und versuchen, es an eine Methode pipeline.addLast zu übergeben, die ein Objekt vom Typ io.netty.channel.ChannelHandler erwartet. ServerHandler ist kein Kind von ChannelHandler, daher kann der Compiler nicht akzeptieren, dass es keine Garantie dafür gibt, dass die tatsächliche Instanz, die zur Laufzeit empfangen wird, Kind von ChannelHandler sein wird.

Dies ist ein einfaches OO-Konzept. Hier verstehe ich nicht, warum Sie Ihr Feld als ServerHandler deklarieren würden.

Verwandte Themen