日期:2014-05-18  浏览次数:20684 次

关于Java中的泛型的疑问:
关于Java中的泛型的疑问:
我的类结构如下:

public interface CheckerBase<T> {
List<CheckResult<T>> 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;

public void setCheckers(List<CheckerBase<?>> value){
this.checkers=value;
}
public List<CheckerBase<?>> getCheckers(){
return this.checkers;
}

public String CheckBy() {
List<String> results = new ArrayList<String>();
for(CheckerBase<?> checker : checkers){
results.addAll(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类型)


------解决方案--------------------
这代码居然能通过编译?!你是怎么做到的?
CheckerBase接口的Check方法返回的是List,实现里返回的是String
------解决方案--------------------
Monitorable.checkBy方法里面,返回值为string,但是程序里返回的是list啊。

LZ再检查一下吧。
------解决方案--------------------

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


调整为如下:

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

------解决方案--------------------
擦,不识别。。再试试。
public interface CheckerBase<<span style="color: #FF0000;">T extends Monitorable</span>> {
    String Check(T target);
}
------解决方案--------------------
引用:
其实我可以把Monitorable修改成这样:

public abstract class Monitorable {
private List<CheckerBase<? super Monitorable>> checkers;

public void setCheckers(List<CheckerBase<? super Monitorable>> value){
this.checkers=value;
}
public List<CheckerBase<?  super Monitorable>> getCheckers(){
return this.checkers;
}

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