有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java泛型和基类

我有以下课程:

public abstract class BaseDaoImpl<T extends BaseEntity> implements BaseDao<T> {


    @Override
    public T createOrUpdate(T t, User user) {
        return createOrUpdate(t, true, user);
    }

    @Override
    public void addOnwerUserToEntity(String entityType, Long entityId, User user) {

        BaseEntity baseEntity = findBaseEntityById(entityType, entityId);

        baseEntity.addOwnerUser(user);

        createOrUpdate(baseEntity, user); // compilation error
    }

}

现在我有以下编译错误:

The method createOrUpdate(T, User) in the type BaseDaoImpl<T> is not applicable for the arguments (BaseEntity, User)    

我做错了什么,为什么createOrUpdate方法不接受BaseEntity对象,以及如何修复它


共 (3) 个答案

  1. # 1 楼答案

    改变

    BaseEntity baseEntity = findBaseEntityById(entityType, entityId);
    

    T baseEntity = findBaseEntityById(entityType, entityId);
    

    我假设BaseDao<T>.findBaseEntityById()具有返回类型T。如果没有,它应该!:-)

  2. # 2 楼答案

    您希望您的“T扩展BaseEntity”涵盖BaseEntity,并且它可以在您将“T”作为参数的任何位置传递。我的朋友,运气不太好。请回顾您对泛型的理解

  3. # 3 楼答案

    问题是,T不一定是BaseEntity。您可以像这样实例化类BaseDaoImpl

    class Widget extends BaseEntity {...}
    BaseDaoImpl<Widget> base = new BaseDaoImpl<>();
    

    在这种情况下,T是一个Widget,因此方法createOrUpdate(...)变成:

    public Widget createOrUpdate(Widget t, User user) {
    

    你不能用一个BaseEntity就这么说