当前位置: 首页 > 知识库问答 >
问题:

在Java中创建静态泛型工厂?

董琦
2023-03-14

我使用getinstance方法遇到了麻烦,无论我用什么方法尝试,我都得到了:

无法对非静态类型T进行静态引用。

    null

我的代码:

public class Data<Template>
{
    private Template[] data;
    private int id;

    public Data(Template[] data)
    {
        this.data = data;
        id = Arrays.hashCode(data);
        log();
    }

    public Template[] getData()
    {
        return data;
    }

    public Integer getId()
    {
        return id;
    }

    private void log()
    {
        System.out.println(this.toString());
    }

    @Override
    public String toString()
    {
        StringBuilder tString = new StringBuilder();
        tString.append(id + ":");
        for (int i = 0; i < data.length; i++)
        {
            tString.append(data[i] + " ");
        }
        return tString.toString();
    }
}

public class Store<T>
{
    private Queue<Data<T>> queue;
    private ConcurrentHashMap<Integer, Data<T>> inProgress;
    private List<T> results;
    private static Store instance = null;

    private Store()
    {
        queue = new ConcurrentLinkedQueue<Data<T>>();
        inProgress = new ConcurrentHashMap<Integer, Data<T>>(16, 0.9f, 1);
        results = new ArrayList<>();
    }

    public void addToStore(Data<T> elment)
    {
        queue.offer(elment);
    }

    public Data<T> getNextTask()
    {
        Data<T> element = queue.poll();
        inProgress.put(element.getId(), element);
        return element;
    }

    public void taskFinishedSuccessfully(Integer id, T result)
    {
        inProgress.remove(id);
        results.add(result);
    }

    public List<T> getResults()
    {
        return results;
    }

    public static Store getInstance(Class<T> type)
    {
        if (instance == null)
        {
            if (type instanceof Integer)
            {
                instance = new Store<Integer>();
            }

            if (type instanceof Float)
            {
                instance = new Store<Float>();
            }

            if (type instanceof Double)
            {
                instance = new Store<Double>();
            }
        }
        return instance;
    }
}

共有1个答案

越勇锐
2023-03-14

不清楚你为什么不只是写

public static <T> Store<T> getInstance() {
  return new Store<T>();
}
 类似资料:
  • 问题内容: 在Java中,我希望具有以下内容: 但是我明白了 我对基本用途以外的泛型没有什么了解,因此对此没有多大意义。我无法在互联网上找到有关该主题的很多信息,这无济于事。 有人可以通过类似的方式澄清这种使用是否可行吗?另外,为什么我最初的尝试失败了? 问题答案: 你不能在静态方法或静态字段中使用类的泛型类型参数。该类的类型参数仅在实例方法和实例字段的范围内。对于静态字段和静态方法,它们在类的所

  • 问题内容: 是否可以在Java中创建泛型类型的实例?我正在根据我所看到的答案进行思考no(由于类型擦除),但是如果有人能看到我所缺少的内容,我将很感兴趣: 编辑:事实证明,超级类型令牌可以用于解决我的问题,但是它需要很多基于反射的代码,如下面的一些答案所示。 问题答案: 你是对的。你做不到。但你可以将其更改为 但这有效。以工厂模式包装它会使它更具容忍性。

  • 问题内容: 我需要在实用工具类中添加带有静态方法的方法,该方法可以解析JSON字符串中的内容并返回内容数组。 问题是这些东西有各种子类型,因此我创建了此方法: 呼叫者如何告诉该方法是什么?还是有更好的方法来做到这一点? 问题答案: 您需要通过它。 泛型在很大程度上是编译时的功能。这意味着它在运行时不可用(某些例外) 在这种情况下,要使泛型类型在运行时可用,必须将其作为附加参数传递。

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。

  • 问题内容: 运行Demo类将在SomeClass中调用静态方法newInstance来调用构造函数并打印问候 定义方法将包括返回类型+方法名称以及参数 newInstance的返回类型是 SomeClass 在我看来很奇怪,因为我的班级叫做SomeClass 而不是 SomeClass 为什么在SomeClass 前面需要 ?看来,如果我不包含它,将会出现一个常见错误,称为“无法对非静态类型T进行

  • 问题内容: 以下是有关如何使Java通用类将单个项目附加到数组的代码段。如何使appendToArray成为静态方法。在方法签名中添加static会导致编译错误。 问题答案: 您唯一可以做的就是将您的签名更改为 重要细节: 返回值之前的泛型表达式始终会引入(声明)新的泛型类型变量。 另外,类型()和静态方法()之间的类型变量永远不会相互干扰。 因此,这意味着什么:如果方法不是,则我的答案将隐藏。A