【问题标题】:Interface definition and generics. Should this be defined differently?接口定义和泛型。这应该有不同的定义吗?
【发布时间】:2012-05-05 09:10:29
【问题描述】:

我有一个班级Employee 和一个班级Building
从类层次结构的角度来看,这些类彼此不相关。
我需要处理一堆 EmployeeBuilding 对象,它们的结果最终会出现在不同的列表中。
所以我有和接口,例如

public interface Processor{  
  public void process(String s, List<?> result);  
}  

这个想法是字符串s 携带与EmployeeBuilding 相关的信息,并且经过一些处理后的实现将Employee 对象或Building 对象添加到结果列表中。
Processor 有两种实现方式,一种是EmployeeProcessor,一种是BuildingProcessor
在代码中的某处,我得到了对其中任何一个的引用,我将 List&lt;Employee&gt;List&lt;Building&gt; 传递给 process 方法。

问题是代码无法编译。
当我这样做时在EmployeeProcessor 内:result.add(new Employee(a,b,c,d));
我明白了:

List 类型中的方法 add(capture#2-of ?) 不是 适用于参数

我想我可以理解问题,但我不想将界面更改为:

public interface Processor{  
  public process(String s, List result);  
}   

即未指定列表类型。
有没有办法解决这个问题?接口定义错了吗?
注意:这个接口是Command模式实现的一部分

【问题讨论】:

  • 1.发布整个错误消息。 2. 发布您的实际代码 - 而不是 sn-ps 甚至不是有效的 Java...
  • @thkala:1) 没有错误消息。 Eclipse编译器提示2)无效java是什么意思?
  • 1.这不是一个“迹象”。这是一个成熟的编译器错误消息。 2.public process(String s, List result);不是一个有效的方法声明——没有返回类型...
  • 1.我已经发布了编译器错误 2。对此我深表歉意。你说的对。我的坏

标签: java oop design-patterns generics


【解决方案1】:

这就是我的想法。

interface Processor<T>{
    public void process(String s, List<T> result);
}

class BuildingProcessor implements Processor<Building>{
    @Override
    public void process(String s, List<Building> result) {
        result.add(new Building());
    }
}

class EmployeeProcessor implements Processor<Employee>{
    @Override
    public void process(String s, List<Employee> result) {
        result.add(new Employee());
    }
}

仅供参考,您可以进一步限制类型。例如,如果BuildingEmployee 类都实现了,比如说Processable,那么你可以做interface Processor&lt;T extends Processable&gt;

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 2020-03-22
    • 2012-03-01
    • 2011-10-31
    • 1970-01-01
    • 2015-01-18
    • 2014-10-06
    • 2011-01-21
    • 2019-07-21
    相关资源
    最近更新 更多