使用泛型/接口在Java中实现复合
我有一个简单的例子:使用泛型/接口在Java中实现复合,java,generics,Java,Generics,我有一个简单的例子: public class Imap { private Responder responder; public Imap(){ this.responder = new Responder(this); } public void startService(){ responder.doStuff(); } public boolean supportsMe(){ retu
public class Imap {
private Responder responder;
public Imap(){
this.responder = new Responder(this);
}
public void startService(){
responder.doStuff();
}
public boolean supportsMe(){
return true;
}
}
public class Udp {
private Responder responder;
public Udp(){
this.responder = new Responder(this);
}
public void startService(){
responder.doStuff();
}
public boolean supportsMe(){
return false;
}
}
public class Responder {
Object parent;
public Responder(Object parent){
this.parent = parent;
}
public void doStuff(){
if(parent.supportsMe()){
System.out.println("Parent supports me.");
} else {
System.out.println("Parent doesn't support me.");
}
}
}
问题是对象的supportsMe未定义。但是,它是为Udp和Imap定义的。我希望响应者足够聪明,能够调用正确的对象。我相信解决方案是使用带有接口的泛型。我尝试了以下泛型,但仍然得到一个类似的编译错误(类型T的方法supportsMe()未定义):
公共类响应程序{
T亲本;
公共响应者(T家长){
this.parent=parent;
}
公共空间{
if(parent.supportsMe()){
System.out.println(“家长支持我”);
}否则{
System.out.println(“家长不支持我。”);
}
}
}
我的问题有什么解决办法吗?访客模式。不要在构造函数中泄漏此。传入
响应程序
并让它访问父级
。使Imap
和Udp
实现一些接口支持的
,该接口声明了支持SME
方法。然后让响应程序
将其父项
字段声明为类型受支持的
@SotiriosDelimanolis,该字段有效@BoristheSpider这将如何导致内存泄漏?这不是内存泄漏,而是一个错误。在此
实际存在之前,传递对此
的引用。这个问题可能非常严重,并且很难调试。考虑这是否是类层次结构的父类——子Cor还没有完成。这应该永远避免。
public class Responder<T> {
T parent;
public Responder(T parent){
this.parent = parent;
}
public void doStuff(){
if(parent.supportsMe()){
System.out.println("Parent supports me.");
} else {
System.out.println("Parent doesn't support me.");
}
}
}