怎样根据泛型的类型自动选择调用不同的实现

天降扫把星 2014-05-14 11:10:54
环境为J2EE的SSI架构
两个对象、省略setter&getter

public class Material {
private String materialNo;
private String materialType;
private String materialUnit;
}

public class Supply {
private String supplyNo;
private String materialType;
private String materialUnit;
}

一个接口

public interface NewInterface<T> {
public void save(T t);
public void select(T t);

}

两个实现

public class MaterialImpl implements NewInterface<Material>{

@Override
public void save(Material t) {
System.out.println("MaterialImpl.save " + t.getMaterialNo());
}
@Override
public void select(Material t) {
System.out.println("MaterialImpl.select " + t.getMaterialNo());
}
}

public class SupplyImpl implements NewInterface<Supply>{

@Override
public void save(Supply t) {
System.out.println("SupplyImpl.save " + t.getSupplyNo());
}

@Override
public void select(Supply t) {
System.out.println("SupplyImpl.select " + t.getSupplyNo());
}

}


现在调用

private NewInterface<Material> newInterface;
Material m = new Material();
m.setMaterialNo("ddd");
newInterface.save(m);

也就是需要接口根据我传入的对象类型自动实例化对应的实现。

然而在Spring实例化对象时,需要明确指定实现的路径,如id = "XXX" class = "com.xx.xxx.impl.XxxxImpl"
以上想根据入参的类型自动实例化是不是不能使用Spring的Bean管理了。
还有在调用newInterface.save(m)一直提示空指针,想问一下怎么编码。

谢谢
...全文
626 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
别闹腰不好 2014-05-14
  • 打赏
  • 举报
回复
private NewInterface<Material> newInterface;// 空指针是因为 ,这里没有出初始化吧 Material m = new Material();          m.setMaterialNo("ddd");         newInterface.save(m); public interface NewInterface<T> { public void save(T t); public void select(T t); } 实现类写一个就行了 : public class SupplyImpl implements NewInterface<T>{ @Override public void save(T t) { System.out.println("SupplyImpl.save " + t.getSupplyNo()); } @Override public void select(T t) { System.out.println("SupplyImpl.select " + t.getSupplyNo()); } } 调用 : ivate NewInterface<Material> newInterface=new SupplyImpl<Material>(); Material m = new Material();          m.setMaterialNo("ddd");         newInterface.save(m);
suciver 2014-05-14
  • 打赏
  • 举报
回复
引用 3 楼 hzau_chen 的回复:
[quote=引用 1 楼 suciver 的回复:] 可以,这种情况下要用工厂模式,也就是由工厂来生成NewInterface的不同实例,用spring的静态工厂方法来创建
不好意思,我又仔细看了下, 发现还是要匹配我传入的参数类型,我想能不能够自动实例化对应的Impl。有没有具体的例子参考 谢谢[/quote] 类型肯定是要传入哪怕你是在程序里面自己写工厂也要传入这个泛型的实际类型的,要不然怎么给你实例化。楼主想要什么都不传直接生成这是不可能的
天降扫把星 2014-05-14
  • 打赏
  • 举报
回复
因为对象是多个,实现也是多个的。同时为了避免重复的编写接口
天降扫把星 2014-05-14
  • 打赏
  • 举报
回复
引用 1 楼 suciver 的回复:
可以,这种情况下要用工厂模式,也就是由工厂来生成NewInterface的不同实例,用spring的静态工厂方法来创建
不好意思,我又仔细看了下, 发现还是要匹配我传入的参数类型,我想能不能够自动实例化对应的Impl。有没有具体的例子参考 谢谢
天降扫把星 2014-05-14
  • 打赏
  • 举报
回复
引用 1 楼 suciver 的回复:
可以,这种情况下要用工厂模式,也就是由工厂来生成NewInterface的不同实例,用spring的静态工厂方法来创建
谢谢你的回答,百度了一下,确实可以这样实现的。
suciver 2014-05-14
  • 打赏
  • 举报
回复
可以,这种情况下要用工厂模式,也就是由工厂来生成NewInterface的不同实例,用spring的静态工厂方法来创建
raistlic 2014-05-14
  • 打赏
  • 举报
回复
为什么用泛型
七神之光 2014-05-14
  • 打赏
  • 举报
回复
类型参数就行了,
别闹腰不好 2014-05-14
  • 打赏
  • 举报
回复
我觉得既然用了泛型,还要针对每个对象写个实现类,还有泛型干吗 大家都知道 集合类用到了泛型 ,我没见过谁自己写个类时候 ,还要针对自己自己的类写个集合类的实现类。
  • 打赏
  • 举报
回复
spring 是有一个容器 来管理所有的对应(原型or单例), 所以你要这么做,也需要把对应的注入对象,进行标记(如注解),然后自己注入。 相对来说自己弄成本较大

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧