关于Java中的泛型的疑问:

BasicArchitect 2014-03-10 10:30:58
关于Java中的泛型的疑问:
我的类结构如下:

public interface CheckerBase<T> {
String Check(T target);
}

public class AChecker implements CheckerBase<APOJO> {
@Override
public String Check(APOJO target) {
// TODO check logic;
}
}

public class BChecker implements CheckerBase<BPOJO> {
@Override
public String Check(BPOJO target) {
// TODO check logic;
}
}


public abstract class Monitorable {
private List<CheckerBase<?>> checkers;
//setter,getter

public List<String> CheckBy() {
List<String> results = new ArrayList<String>();
for(CheckerBase<?> checker : checkers){
results.add(checker.Check( this ));
}
return results;
}
}


public class APOJO implements Monitorable{
......
}

public class BPOJO implements Monitorable{
......
}

------------------------
现在的问题出现在Monitorable类的private List<CheckerBase<?>> checkers;这个句话上。
如果用List<CheckerBase<?>>类型,则checker.Check( this )提示参数不匹配,
如果不用List<CheckerBase<?>>这个类型,用什么类型才能保证所有的CheckerBase子类的
对象都能加入到这个List中呢?(不考虑用Object类型)

我可以把Monitorable改成这样:

public abstract class Monitorable {
private List<CheckerBase<? super Monitorable>> checkers;
// setter,getter

public List<String> CheckBy() {
List<String> results = new ArrayList<String>();
for(CheckerBase<? super Monitorable> checker : checkers){
results.add(checker.Check( this ));
}
return results;
}
}

但是下面的代码却出现错误:

public static void main(String[] args) {
APOJO = new APOJO()
List<CheckerBase<? super Monitorable>> checkers = new ArrayList<CheckerBase<? super Monitorable>> ();
checkers.add(new AChecker());
APOJO.setCheckers(checkers);
}

代码:

checkers.add(new AChecker());

提示参数类型不匹配。

(记事本修改的代码,可能有错误。不好意思了。)



...全文
205 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
取经和尚 2014-03-11
  • 打赏
  • 举报
回复
引用 5 楼 BasicArchitect 的回复:
我调整了我的设计:

public interface CheckerBase {
	String Check(Monitorable target) throws Exception ;
}

public class AChecker implements CheckerBase {
	@Override
	public String Check(Monitorable target) throws Exception {
		if( !(target instanceof APOJO )){
			throw new Exception("");
		}			
		...
	}
}
也就是说,我去掉了CheckerBase的泛型参数。 把方法的参数修改为了Monitorable。 在具体的 CheckerBase子类中判断是否是该子类能CHeck的对象。不是抛出异常。 实际上这也是我第一版的设计,但是这里的问题就是需要一个类型判断。 本来我想通过泛型做到强类型化的优点。但是实现不了。
不用去掉泛型, public abstract class Monitorable { private List<AChecker<?>> checkers; //注意:这个list类型用CheckerBase的实现类 //setter,getter public List<String> CheckBy() { List<String> results = new ArrayList<String>(); for(AChecker <?> checker : checkers){ results.add(checker.Check( this )); } return results; } }
取经和尚 2014-03-10
  • 打赏
  • 举报
回复
我的想法是把interface CheckerBase的实现类放在List里面遍历,毕竟interface不能实例化
BasicArchitect 2014-03-10
  • 打赏
  • 举报
回复
引用 1 楼 A544365013 的回复:
你把一个接口放在List里面然后遍历,再调用它的Check方法,你觉得可行吗?
你觉得应该怎么做?
取经和尚 2014-03-10
  • 打赏
  • 举报
回复
你把一个接口放在List里面然后遍历,再调用它的Check方法,你觉得可行吗?
BasicArchitect 2014-03-10
  • 打赏
  • 举报
回复
我调整了我的设计:

public interface CheckerBase {
	String Check(Monitorable target) throws Exception ;
}

public class AChecker implements CheckerBase {
	@Override
	public String Check(Monitorable target) throws Exception {
		if( !(target instanceof APOJO )){
			throw new Exception("");
		}			
		...
	}
}
也就是说,我去掉了CheckerBase的泛型参数。 把方法的参数修改为了Monitorable。 在具体的 CheckerBase子类中判断是否是该子类能CHeck的对象。不是抛出异常。 实际上这也是我第一版的设计,但是这里的问题就是需要一个类型判断。 本来我想通过泛型做到强类型化的优点。但是实现不了。

67,538

社区成员

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

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