【问题标题】:Java generics - ensure static method is implementedJava 泛型 - 确保实现静态方法
【发布时间】:2011-01-29 14:40:54
【问题描述】:

我正在使用这样的泛型:public class MyList<T>。有什么办法可以保证T代表的类实现了某个静态方法?

【问题讨论】:

  • @Kirk Woll:我试图避免必须子类化东西或必须声明真正应该是静态的非静态方法。同时,我希望使用泛型使我的代码尽可能简洁。
  • @user,我的意思是,即使您可以添加这样的约束,这也毫无意义,因为您无法在通用 @ 中使用该功能首先是 987654323@。您将无法从泛型列表中调用这些静态方法——您无法通过泛型参数对静态成员执行任何操作。
  • 恕我直言,您的方法不应该是静态的。即使您需要一个方法为每个实例返回相同的值并且根本不使用this,它也不应该是静态的(我花了很长时间才理解)。事实上,静态方法的用途很少。
  • @Kirk Woll:基本上,我有一些非常相似的课程。这些类的一部分是检查给定的字符串是否与所需的格式匹配。我使用静态方法进行检查。我目前正在使用泛型实现这些类。所以我必须以某种方式检查格式。我显然可以使格式检查方法非静态,但我正在寻找更优雅的解决方案。
  • 为什么什么?也许stackoverflow.com/questions/3251269/… 能帮上忙?

标签: java generics


【解决方案1】:

不,即使没有泛型,也永远无法确保类实现静态方法。

但是,您可以创建通用静态方法。

public static <T> List<T> makeSingletonList(T item) {
      ArrayList<T> result = new ArrayList<T>();
      result.add(item);
      return result;
}

【讨论】:

  • 并将其放入您的类需要扩展的抽象类中。
【解决方案2】:

很遗憾没有。

作为替代方案,请考虑您的类的静态方法是否属于某种关联类,例如构建器:

class Person {
    public static Person createFromDatastore(Datastore datastore) { ... }
}

将静态作为非静态方法移动到单独的类可能会更好:

class PersonBuilder implements Builder<Person> {
     public Person createFromDatastore(Datastore datastore) { ... }
}

这意味着您现在可以要求您的泛型类的客户提供它:

public class MyList<B extends Builder<T>, T> ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    相关资源
    最近更新 更多