我想做的是以下内容:
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
,但这是不允许的。
答案 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() {...}
}
通过Query
到Type
这样的正式关系,您可以将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.