我有一个基本的泛型类,代表我的模型中具有任何类型标识符的所有对象:
public abstract class IdObject<T> {
private T id;
public T getId() { return this.id; }
public void setId(T id) { this.id = id; }
}
Run Code Online (Sandbox Code Playgroud)
然后,我有一个代表 IdObject 对象的 DAO 的超级接口:
public interface IdObjectDAO<T extends IdObject<U>> {
public T getObjectById(U id);
}
Run Code Online (Sandbox Code Playgroud)
但我收到“U 无法解析为类型”的编译器错误。如果我通过以下方式更改接口定义:
public interface IdObjectDAO<T extends IdObject<U extends Object>> {...}
Run Code Online (Sandbox Code Playgroud)
我收到“标记“扩展”,预期的语法错误的编译器错误。在没有编译器错误的情况下定义接口的唯一方法是:
public interface IdObjectDAO<T extends IdObject<? extends Object>> {...}
Run Code Online (Sandbox Code Playgroud)
但是然后我没有该public T getObjectId(U id)方法的类型别名(U)。我发现解决它的唯一解决方案是使用 2 个类型参数:
public interface IdObjectDAO<T extends IdObject<U>, U> {...}
Run Code Online (Sandbox Code Playgroud)
但我想避免使用这两个类型参数来避免在模型和 DAO 类中指定标识符类型:
public …Run Code Online (Sandbox Code Playgroud)