Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 获得;“不适用”;泛型类型的编译错误_Java_Oop_Generics - Fatal编程技术网

Java 获得;“不适用”;泛型类型的编译错误

Java 获得;“不适用”;泛型类型的编译错误,java,oop,generics,Java,Oop,Generics,我有以下课程: public interface IEntity<T extends IEntity<T>> { T createNewEntity(IEntityCreator creator); } public interface IEntityCreator { <T extends IEntity<T>> T createNewEntity(T source); } public abstract class Entity

我有以下课程:

public interface IEntity<T extends IEntity<T>>
{
   T createNewEntity(IEntityCreator creator);
}

public interface IEntityCreator
{
   <T extends IEntity<T>> T createNewEntity(T source);
}

public abstract class EntityBase<T extends EntityBase<T>> implements IEntity<T>
{
   @Override
   public T createNewEntity(IEntityCreator creator)
   {
      return creator.createNewEntity(this); //Error here
   }
}
公共接口的可扩展性
{
T createNewEntity(IEntityCreator creator);
}
公共接口IEntityCreator
{
T createNewEntity(T source);
}
公共抽象类EntityBase实现了Entity
{
@凌驾
公共T createNewEntity(IEntityCreator creator)
{
返回creator.createNewEntity(this);//此处出错
}
}
我得到以下错误:

“绑定不匹配:IEntityCreator类型的泛型方法createNewEntity(T)不适用于参数(EntityBase)。推断的类型EntityBase不是绑定参数的有效替代品>”

我使用以下代码尝试了不同的方法,但没有成功:

public interface IEntity<T extends IEntity<T>>
{
   T createNewEntity(IEntityCreator<T> creator);
}

public interface IEntityCreator<T extends IEntity<T>>
{
   T createNewEntity(T source);
}

public abstract class EntityBase<T extends EntityBase<T>> implements IEntity<T>
{
   @Override
   public T createNewEntity(IEntityCreator<T> creator)
   {
      return creator.createNewEntity(this); //Error here
   }
}
公共接口的可扩展性
{
T createNewEntity(IEntityCreator creator);
}
公共接口IEntityCreator
{
T createNewEntity(T source);
}
公共抽象类EntityBase实现了Entity
{
@凌驾
公共T createNewEntity(IEntityCreator creator)
{
返回creator.createNewEntity(this);//此处出错
}
}
这次编译器说:

“类型IEntityCreator中的方法createNewEntity(T)不适用于参数(EntityBase)”

这个错误的原因是什么?我怎样才能纠正它


谢谢

这里有很好的额外模式,但这会编译

public interface IEntity<T extends EntityBase<T>>
{
   T createNewEntity(IEntityCreator<T> creator);
}

public interface IEntityCreator<T extends EntityBase<T>>
{
   T createNewEntity(EntityBase<T> entityBase);
}

public abstract class EntityBase<T extends EntityBase<T>> implements IEntity<T>
{
   @Override
   public T createNewEntity(IEntityCreator<T> creator)
   {
      return creator.createNewEntity(this); 
   }
}
公共接口的可扩展性
{
T createNewEntity(IEntityCreator creator);
}
公共接口IEntityCreator
{
T createNewEntity(EntityBase EntityBase);
}
公共抽象类EntityBase实现了Entity
{
@凌驾
公共T createNewEntity(IEntityCreator creator)
{
返回creator.createNewEntity(此);
}
}

错误的原因是
IEntityCreator.createNewEntity()
需要一个实现
IEntity
T
,而您正在传递
EntityBase
,因此它应该实现
IEntity
,而它不这样做

您需要显式地将
this
强制转换为
T
(一个从
EntityBase
派生的类,它实际上实现了
IEntity
),就像Wundwin Born在注释中建议的那样:

public T createNewEntity(IEntityCreator creator) {
    return creator.createNewEntity((T)this);
}

你的第一行:公共界面的开放性。在
EntityBase.createNewEntity
声明如何替换为
返回creator.createNewEntity((T)this)中,在将
T
重设为
EntityBase
后,您忘记了一个“>”???