2014-09-26 55 views
0

我有以下类别:获得“不适用”与泛型类型编译错误

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 
    } 
} 

我收到以下错误:

“约束不匹配:类型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 
    } 
} 

这一次的编译器说:

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

,这是什么错误的原因是什么?我该如何纠正它?

感谢

+0

你的第一行:公共接口IEntity > 。在IEntity 2014-09-26 09:06:29

+0

尝试在'EntityBase.createNewEntity'声明中替换'EntityBase ' – talex 2014-09-26 09:13:47

+1

如何用'return creator.createNewEntity((T)this'')替换? – 2014-09-26 09:14:37

回答

0

漂亮交流中心模式在这里,但这个编译...

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); 
    } 
} 
0

错误的原因是IEntityCreator.createNewEntity()需要T它实现IEntity<T>,你是路过EntityBase<T>,所以应该实施IEntity<EntityBase<T>>,它不这样做。

您需要显式转换thisT(从EntityBase<T>这实际上实现IEntity<T>派生类),如Wundwin出生建议在注释:

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