Java泛型类有两个相关类型

时间:2013-03-11 19:13:10

标签: java generics

我想做的是以下内容:

public class DBManager<T extends Type , Q extends Query>{
    T create(T t);
    Collection<T> read(Q query);
    T update(T t);
}

但是,我只想要这个类的实例化,其中T和Q是相关的。例如,如果T是AppleType,那么我希望Q是AppleQuery而不是PearQuery。

有没有办法做到这一点,或产生类似的行为?

我尝试了Q extends T & Query,但这是不允许的。

4 个答案:

答案 0 :(得分:4)

除非类型本身在类型系统中具有某种关系,否则不能这样做。

由于我不知道你想要做什么,很难推荐一些精确的东西,但听起来你可能想做这样的事情:

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() {...}
}

通过QueryType这样的正式关系,您可以将DBManager定义为:

public class DBManager<T extends Type, Q extends Query<T>> {
    T read(Q id);
}

答案 1 :(得分:1)

由于Q未在返回类型中使用,因此您不需要它。简单地

interface DbManager<T extends Type>

    T read(Query<? extends T> query)

,其中

interface Type

interface Query<T extends Type>

答案 2 :(得分:0)

你可以把一切都变得通用:

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>>

答案 3 :(得分:0)

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.