2

我想要做的是以下内容:

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

4 回答 4

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

有了从Queryto的正式关系Type,您就可以这样定义DBManager

public class DBManager<T extends Type, Q extends Query<T>> {
    T read(Q id);
}
于 2013-03-11T19:20:52.247 回答
1

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

interface DbManager<T extends Type>

    T read(Query<? extends T> query)

在哪里

interface Type

interface Query<T extends Type>
于 2013-03-11T19:51:26.567 回答
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>>
于 2013-03-11T19:17:59.940 回答
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.
于 2013-03-11T19:28:27.290 回答