【问题标题】:Generic method of abstract class抽象类的泛型方法
【发布时间】:2012-01-03 16:24:23
【问题描述】:

我有一个public abstract class Model { //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;
 }
  1. T 应该告诉调用者它应该使用的具体类。这可能吗?
  2. 如何从Model 子类的另一个方法调用此方法?我试过resultsetMap&lt;Course&gt;(res);,但它看起来像一个语法错误

【问题讨论】:

  • “这可能吗?”是什么意思?你试过编译吗?
  • 不,我没有,我是一位经验丰富的程序员(还不是在 java 中),我想因为对语言没有感觉而受到抨击。如果我没有受到抨击,这对我来说意味着我走在正确的道路上:D
  • 有点离题,但我建议您返回 Map 而不是 HashMap。因此,您将实现和接口分开。然后你可以在不改变界面的情况下改变实现。
  • 谢谢@zbindigonzales,会的。

标签: java generics


【解决方案1】:

由于该方法是继承的,因此您可以将其称为super.&lt;ConcModel&gt;resultsetMap(/* arg */);this.&lt;ConcModel&gt;resultsetMap(/* arg */);。第二或第一分别取决于子类是否覆盖它。

Tutorial on how to call a generic method.

【讨论】:

  • 我只是在想“通用”部分——如何告诉它T 是什么?
  • 对于你需要使用的,T 作为方法参数类型。
  • 好的那么如何指定T?我不知道“方法参数类型”是什么,请告诉我语法。
  • 我只想在基类Model 中编写此方法一次,然后从另一个子类Foo 调用它,但它应该为我生成另一个类Bar 模型的列表。所以从这个意义上说,我不认为它实际上映射到继承,而是某种多态性。
  • 因为,&lt;T extends Model&gt; 中的类型参数T 表示Model 的子类。所以,Bar 必须是Model 的子类。
【解决方案2】:

您不能调用T.getNew(),因为T 的类型在运行时会被删除。如果需要调用 Class 方法,可以传入 Class 对象。

在您的代码中,“T”描述了一种类型,它不是任何事物的实例,因此您不能在其上调用方法。如果它是对象的实例,则无论如何都需要将其传递给方法,如果它是静态方法,则不能被覆盖。

我会考虑使用工厂模式,即将模型工厂传递给这个方法。

【讨论】:

  • 如果getNewModel 中的一个方法呢?
  • 是的 getNew()Model 的一个方法,它会被那些子类覆盖。 T extends Model 不就是这样做的吗?
  • 如果该函数是静态的,你可以调用T.getNew(),因为T被擦除为Model,所以T.getNew()Model.getNew()是一样的。也就是说,后者在风格方面会更可取。
  • @yshavit - 但静态方法不能被覆盖。
  • @brain True - 该代码可能没有达到 OP 的预期。但它会编译,如果你理解擦除,结果甚至不会那么奇怪。
猜你喜欢
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多