具有两个相关类型的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>