Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类的泛型方法_Java_Generics - Fatal编程技术网

Java 抽象类的泛型方法

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

我得到了一个公共抽象类模型{//impl}的以下方法,声明如下:

 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的一个子类。