Java 抽象类的泛型方法
我得到了一个公共抽象类模型{//impl}的以下方法,声明如下:Java 抽象类的泛型方法,java,generics,Java,Generics,我得到了一个公共抽象类模型{//impl}的以下方法,声明如下: protected <T extends Model> HashMap<String, Model> resultsetMap(ResultSet res) { HashMap<String, Model> data = new HashMap<String, Model>(); try { while(res.next()) {
protected <T extends Model> HashMap<String, Model> resultsetMap(ResultSet res) {
HashMap<String, Model> data = new HashMap<String, Model>();
try {
while(res.next()) {
Model obj = T.getNew(res);
data.put(obj.toString(), obj);
}
} catch(SQLException e) {
return null;
}
return data;
}
T应该告诉调用方它应该使用的具体类。这可能吗?
我如何从模型子类的另一个方法调用这个方法?我试过使用ResultestPress;但这看起来像是一个语法错误
无法调用t.getNew,因为t的类型在运行时被擦除。如果需要调用类方法,可以传入类对象
在您的代码中,“T”描述一个类型,它不是任何东西的实例,因此您不能对它调用方法。如果它是一个对象的实例,则无论如何都需要将其传递到方法中,如果它是一个静态方法,则不能重写它
我会考虑使用工厂模式,即将模型工厂传递给该方法。
< P>由于该方法是继承的,您可以称之为Suff.ReultStMatp/*ARG*/;或者这个.resultsetMap/*arg*/;。第二个或第一个分别基于子类是否重写它你说这可能是什么意思?你试过编译它吗?没有,我是一个经验丰富的程序员,但不懂java,我想因为对这种语言还没有感觉而受到抨击。如果我没有被攻击,这意味着我走的是正确的道路:有点偏离主题,但我建议您返回一个Map而不是HashMap。因此,将实现和接口分开。然后您可以在不更改接口的情况下更改实现。谢谢@zbingonzales,可以。如果getNew是Model中的一个方法呢?是的,getNew是Model中的一个方法,它会被这些子类覆盖。这不是t extends Model所做的吗?如果该函数是静态的,您可以调用t.getNew,因为t被擦除到Model,所以t.getNew与Model.getNew相同。也就是说,后者在风格方面更可取。@yshavit-但静态方法不能被重写。@brain True-该代码可能没有达到OP所希望的效果。但是它会编译,如果你理解擦除,结果也不会那么奇怪。我只是在想泛型部分-如何告诉它t是什么?为此你需要使用,t作为方法参数类型。那么如何指定t?我不知道什么是方法参数类型,请告诉我语法。我只想在基类模型中编写这个方法一次,并从另一个子类Foo调用它,但它应该生成另一个类Bar模型的列表。所以在这个意义上,我认为它实际上并不映射到继承,而是某种多态性。因为,类型参数t in意味着某种模型的子类。所以,Bar必须是Model的一个子类。