gpt4 book ai didi

java - Java Generics 和 Apache Olingo 4 的编译错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:37:14 25 4
gpt4 key购买 nike

我扩展了 Apache Olingo 4 的一些基类(仍在开发中)以允许更强的打字。然而,我对泛型的使用导致了一个我没有预料到的错误。

我有一个类型参数 E,它扩展了 FooODataEntity,而 FooODataEntity 又实现了 ODataEntity 接口(interface)。由于 FooODataEntity 是一个 ODataEntity(只是更具体),我希望它可以顺利编译。然而,getEntities() 有一个编译错误,如下面的代码所示。

此外,我希望能够指定 List<E>作为我覆盖 getEntities() 的返回类型但后来我收到一个编译错误:

'getEntities()' in 'com.foo.restapi.client.olingo.FooEntitySet' clashes with 'getEntities()' in 'org.apache.olingo.commons.api.domain.v4.ODataEntitySet'; attempting to use incompatible return type

我在这里缺少什么?

FooODataEntitySet:

package com.foo.restapi.client.olingo;

import com.foo.restapi.client.FooODataEntity;
import com.foo.restapi.client.exceptions.FooRuntimeException;

import org.apache.olingo.commons.api.domain.v4.ODataAnnotation;
import org.apache.olingo.commons.api.domain.v4.ODataEntity;
import org.apache.olingo.commons.api.domain.v4.ODataEntitySet;
import org.apache.olingo.commons.core.domain.AbstractODataEntitySet;

import java.lang.reflect.Constructor;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

public class FooEntitySet<E extends FooODataEntity>
extends AbstractODataEntitySet implements ODataEntitySet {

private final List<E> entities = new ArrayList<E>();

public FooEntitySet() {
super();
}

@Override
public List<ODataEntity> getEntities() {
// compile error
// Incompatible types. Found: 'java.util.List<E>',
// required: 'java.util.List<org.apache.olingo.commons.api.domain.v4.ODataEntity>'

return entities;
}
}

FooODataEntity:

package com.foo.restapi.client;

public class FooODataEntity extends AbstractODataPayload
implements ODataEntity, ODataSingleton {

// code not shown
}

最佳答案

您无法执行此操作是有原因的。而FooODataEntityODataEntity ,一个List<FoodODataEntity>不是 List<ODataEntity> .

让我们更详细地介绍一下:

假设我有这门课:

public class BaconODataEntity implements ODataEntity {
// Pretend I implement all the ODataEntity things
}

我可以添加 BaconODataEntity 的实例进入List<BaconODataEntity>和一个 List<ODataEntity> ...但不是进入 List<FooODataEntity> .

所以,只需让您转换 List<FooODataEntity>List<ODataEntity>会破坏泛型本来要引入的类型安全性,因为我可以添加 BaconODataEntity到它

那么,如何解决这个问题呢?好吧,如果你绝对需要你的列表是 List<E extends FooODataEntity> , create a new List and copy the elements into it并返回该列表。

关于java - Java Generics 和 Apache Olingo 4 的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25214169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com