另一个泛型类的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);