另一个泛型类的Java泛型类

另一个泛型类的Java泛型类,java,generics,interface,dao,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; } } 但我希望避免使用这两个类型参数来避免在模型和DAO类中指定标识符类型: public class Pe

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

public abstract class IdObject<T> {
    private T    id;
    public  T    getId()     { return this.id; }
    public  void setId(T id) { this.id = id;   }
}
但我希望避免使用这两个类型参数来避免在模型和DAO类中指定标识符类型:

public class     Person    extends IdObject<Integer> {...}
public interface PersonDAO extends IdObjectDAO<Person, Integer> {...}
                                                     ^^^^^^^^^ <== avoid this
公共类Person扩展IdObject{…}
公共接口PersonDAO扩展IdObjectDAO{…}

^^^^^^^^^一个接口不仅仅是由它的名称定义的,它还包括在其中定义的所有方法的签名。既然你有办法

public T getObjectById(U id);
您的界面在
T
U
中都是通用的。接口无法从
IdObject
确定
U
,因此如果需要编译时类型安全,必须明确指定它

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

1) 丢失式安全:

public interface IdObjectDAO<T extends IdObject<?>> {
    public T getObjectById(Object id);
}
对于类型为
t
的对象
t

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

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

我认为双参数版本是实现这一点的正确且唯一的方法。您希望编译器能够“查看”IdObject中的id类型,但这是不可能的。请尝试此公共接口IdObjectDAO{public T getObjectById(U id);}这也应该可以回答您的问题:
public class     Person    extends IdObject<Integer> {...}
public interface PersonDAO extends IdObjectDAO<Person, Integer> {...}
                                                     ^^^^^^^^^ <== avoid this
public T getObjectById(U id);
public interface IdObjectDAO<T extends IdObject<?>> {
    public T getObjectById(Object id);
}
id.equals(t.getId());
public interface IdObjectDAO<T extends IdObject<?>> {
    public T getObjectBySample(T sample);
}
Integer id = 5;
Person sample = new Person(id);
Person object = personDao.getObjectBySample(sample);