【问题标题】:Factory method for a generic implementation class通用实现类的工厂方法
【发布时间】:2020-07-27 23:58:23
【问题描述】:

有一个通用接口:

public interface IMyQueue<T> {
  //...
}

并且有一个通用类实现它:

public class MyQueueImp<T> implements IMyQueue<T> {
  //...
}

我希望实现有一个工厂方法:一个公共静态方法getInstance,它为该泛型类实例化一个对象。

public class MyQueueImp<T> implements IMyQueue<T> {
  public static IMyQueue getInstance() {
     ///....
  }
}

所以我可以这样称呼它:

IMyQueue<Integer> queue = MyQueueImpl.getInstance();

问题是在这个静态方法中没有访问通用T

MyPriorityQueueImpl.this' cannot be referenced from a static context

我想知道我该怎么做?

【问题讨论】:

    标签: java


    【解决方案1】:

    您的工厂方法是静态的,因此它对T 的实际参数一无所知。您必须在方法本身上声明它:

    public static <U> IMyQueue<U> getInstance() {
       return new MyQueueImp<U>(); //or whatever instantiation you have
    }
    

    旁注:在IMyQueue 的一个特定实现中拥有IMyQueue 工厂有点奇怪。也许放置这个工厂方法的更好的地方是一个单独的类,或者你甚至可以把它放在IMyQueue 本身中。

    【讨论】:

    • 但是如果我把它放在接口中并保持静态,那么我必须为其提供实现。不知道要使用哪个实现,应该如何实现?
    • 我想这就是工厂的意义所在。您的工厂返回该接口类型的对象,它决定提供哪个实现。如果你的getInstance() 方法只是创建一个MyQueueImp 对象,那么它更像是一个构造函数,也许getInstance() 应该返回MyQueueImp&lt;U&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多