另一个泛型类的Java泛型类

标签 java generics interface dao

我有一个基本泛型类,代表我的模型的所有对象,这些对象具有任何类型的标识符:

public abstract class IdObject<T> {
    private T    id;
    public  T    getId()     { return this.id; }
    public  void setId(T id) { this.id = id;   }
}

然后,我有一个 super 接口(interface)代表那些 IdObject 对象的 DAO:

public interface IdObjectDAO<T extends IdObject<U>> {
    public T getObjectById(U id);
}

但我得到“U cannot be resolved to a type”的编译器错误。如果我通过以下方式更改接口(interface)定义:

public interface IdObjectDAO<T extends IdObject<U extends Object>> {...}

我收到编译器错误“ token “扩展”上的语法错误”,预期”。在没有编译器错误的情况下定义接口(interface)的唯一方法是:

public interface IdObjectDAO<T extends IdObject<? extends Object>> {...}

但是我没有 public T getObjectId(U id) 方法的类型别名 (U)。我发现解决它的唯一解决方案是使用 2 种类型的参数:

public interface IdObjectDAO<T extends IdObject<U>, U> {...}

但我想避免使用这两种类型参数以避免在模型和 DAO 类中指定标识符类型:

public class     Person    extends IdObject<Integer> {...}
public interface PersonDAO extends IdObjectDAO<Person, Integer> {...}
                                                     ^^^^^^^^^ <== avoid this

任何人都可以用另一种方式来实现这个泛型的泛型或定义 IdObjectDAO 接口(interface)吗?

提前致谢!

最佳答案

接口(interface)不仅由其名称定义,它还包含其中定义的所有方法的签名。既然你有方法

public T getObjectById(U id);

您的界面在 T 中都是通用的和 U .接口(interface)没办法判断U来自 IdObject<U> ,因此如果您想要编译时类型安全,则必须明确指定它。

如果你真的坚持只提供T作为通用参数,我可以想出的两个(非常糟糕的)解决方法是:

1) 失去类型安全:

public interface IdObjectDAO<T extends IdObject<?>> {
    public T getObjectById(Object id);
}

如果你实现 equalsU正确,仍然可以成功调用

id.equals(t.getId());

对于一个对象 t类型 T .

2) 将您的 ID 包装在类型为 T 的对象中:

public interface IdObjectDAO<T extends IdObject<?>> {
    public T getObjectBySample(T sample);
}

你可以这样调用它:

Integer id = 5;
Person sample = new Person(id);
Person object = personDao.getObjectBySample(sample);

关于另一个泛型类的Java泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24182074/

相关文章:

java - Bouncy CaSTLe 密码学 API 可以在 Android 中使用吗?

java - httppost 导致应用程序崩溃

java - 有没有办法防止 JFormattedTextField 自动删除无效输入?

c# - 从派生类调用的虚拟方法中的 typeof this

generics - 使用泛型的计算表达式

java - 在外部库中启用日志记录

java - 为什么在 Entry<K,V> 中需要键入参数 <K,V>?

interface - crate 级别的可见性

java - 符合 .implements 的数组

c# - 为每个类提取一个接口(interface)是最佳实践吗?