Java泛型,绑定不匹配:类型不是bounded参数的有效替代品

时间:2018-06-22 08:50:30

标签: java generics

我有一个应该返回扩展BaseDto类的对象列表的类。

所以我写了这个

const InputField = props => (
  <div className="input-row">
    <input
      {...props.input}
      type={props.type}
      className="form-control input-box__input"
      placeholder={props.placeholder}
      value={props.value}
      defaultValue={props.defaultValue}
      defaultChecked={props.defaultChecked}
      disabled={props.disabled}
      onChange={props.onChange}
      onKeyDown={this.onKeyDown}
      checked={props.checked}
    />
    {props.meta.touched && props.meta.error &&
    <span className="error">
        {props.intl.formatMessage({ id: props.meta.error }) }
      </span>}
  </div>
);

const onKeyDown = (e) => {
    // Add logic here
    }
}

这是应该在列表中返回的对象

public class Worker<T extends BaseDto> {

   private T t;

     ArrayList<T> getList() {
      ....
     }  
}

但是当我写的时候:

public class MyDTO extends  BaseDto implements Serializable {
...
}

它不会编译并显示以下错误:

  

边界不匹配:MyDTO类型不能有效替代Worker类型的有界参数

怎么了?

1 个答案:

答案 0 :(得分:0)

Worker<MyDTO> q = new Worker<MyDTO>(); // this is fine

您提供的代码应该可以运行,我在这里尝试过并且可以正常编译。

但是,此行无法在Java中编译:

Worker<BaseDto> dto = q; // this is not

因为Java中的通用类型是不变,这意味着即使X或Y是彼此的子类型,两种类型List<X>List<Y>是不兼容的。在支持协方差的语言中,由于MyDTO是BaseDto的子类型,因此可以编译此行。