具有两个相关类型的Java泛型类
我想做的是:具有两个相关类型的Java泛型类,java,generics,Java,Generics,我想做的是: public class DBManager<T extends Type , Q extends Query>{ T create(T t); Collection<T> read(Q query); T update(T t); } 公共类DBManager{ T创建(T); 采集读取(Q查询); T更新(T); } 然而,我只想要T和Q相关的这个类的实例化。例如,如果T是AppleType,那么我希望Q是AppleQuery
public class DBManager<T extends Type , Q extends Query>{
T create(T t);
Collection<T> read(Q query);
T update(T t);
}
公共类DBManager{
T创建(T);
采集读取(Q查询);
T更新(T);
}
然而,我只想要T和Q相关的这个类的实例化。例如,如果T是AppleType,那么我希望Q是AppleQuery而不是PearQuery
有没有办法做到这一点,或者产生类似的行为
我尝试了
Q扩展T&Query
,但这是不允许的。您可以使所有内容都通用:
public class Type<Q extends Query<? extends Type<Q>>
public class Query<T extends Type<? extends Query<T>>
public class DBManager<T extends Type<Q> , Q extends Query<T>>
公共类类型除非类型本身在类型系统中有某种关系,否则不能这样做
因为我不知道你到底想做什么,所以很难精确地推荐一些东西,但听起来你可能想做这样的事情:
public abstract class Type {
...
}
public class AppleType extends Type {
...
}
public abstract class Query<T extends Type> {
public abstract T doQuery(); /* Or so? */
}
public class AppleQuery extends Query<AppleType> {
public AppleType doQuery() {...}
}
Java中没有多重继承。为什么不这样做呢
public class Generic{
// Generic atributes and methods.
}
public class ClassA extends Generic{
// ClassA atributes and methods overwriting, if need it, the extended methods from Generic class.
}
public class ClassB extends Generic{
// ClassB atributes and methods overwriting, if need it, the extended methods from Generic class.
}
... // You can instantiate so many classes as you need. You can use the factory pattern.
因为Q
不用于返回类型,所以您不需要它。简单地
interface DbManager<T extends Type>
T read(Query<? extends T> query)
接口数据库管理器
看不懂(Queryen如果你能做到这一点,我认为你在实现方面不会走得太远。为什么不呢?你完全有可能是正确的,但我以前没有在Java中使用泛型,我现在还不知道原因。你对类型和查询有多大的控制权?如果它们来自你的库,你可以包装它们。)“背书类型”对象中的id对。是否键入和查询您自己的类?如果是,是否可以共享每个类的详细信息?关系是什么(如果有)在类型
和查询
类之间?你可能想让公共类类型
等变得有用。@TomHawtin tackline:是的;我想提出这个建议。我很确定我在最近的一次SO回答中经历了这整件繁琐的事情,但我找不到它。这里有一个类似的例子:
interface DbManager<T extends Type>
T read(Query<? extends T> query)
interface Type
interface Query<T extends Type>