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

Java静态工厂,用于实现具有通用方法参数的接口的类

经佐
2023-03-14

我有以下静态工厂实现:

public class HandlersFactory {
private static Map<ProviderType, Handler<? extends Request>> handlers;

public static Handler<? extends Request> get(ProviderType type) {
    if (handlers == null) {
        initializeHandlers();
    }

    if (handlers.containsKey(type)) {
        return handlers.get(type);
    }

    throw new HandlerNotFoundException("Handler " + type.toString() + " not found");
}

private static void initializeHandlers() {
    handlers = new HashMap<>();

    handlers.put(ProviderType.FIRST, new FirstHandler());
    handlers.put(ProviderType.SECOND, new SecondHandler());
}

FirstHandler和SecondHandler都实现以下接口:

public interface Handler<R extends Request> {
    void handle(R request);
}

请求对象是两个附加类的基类,其中包含请求的附加数据

在我的主课上,我试着做以下几点:

public void handle(Request request) {
    HandlersFactory.get(request.getProvider()).handle(request);
}

请求的源由HTTP请求体提供,它可以解析为请求子类中的任何一个。我得到的编译错误是:“必需类型:捕获?扩展请求,提供请求”。

我知道请求对象不会扩展自身,这听起来很奇怪,但有没有办法这样调用handle方法?

共有1个答案

薛英卫
2023-03-14

虽然不是很优雅,但以下修改应该有效:

public static <T extends Request> Handler<T> get(ProviderType type) {

return (Handler<T>) handlers.get(type);
 类似资料:
  • 我在读有效的Java课本。第一项是关于使用静态工厂方法而不是公共构造函数。我的疑问是,如果我正在指定我如何在中指定静态工厂方法?因为Java不支持内部的静态方法。教材指定了如何创建包含公共静态工厂方法的不可实例化类。但是这些方法如何访问实现类的私有构造函数呢? 教材中说,如果要定义,请创建一个不可实例化的类,并在该类中包含静态工厂方法。但是类中定义的方法如何访问具体实现的私有构造函数 编辑:-以下

  • 问题内容: 我熟悉静态工厂方法的概念和好处,如Joshua Bloch的EffectiveJava中所述: 工厂方法具有名称,因此与构造函数不同,您可以拥有多个具有相同签名的工厂方法。 工厂方法不必创建新的对象。他们可以返回先前创建的对象。这对于不可变对象或值对象很有用。 与构造方法不同,工厂方法可以返回其返回类型的任何子类型的对象。 现在,我正在尝试为正在学习Java和OO原理的人员解释静态工厂

  • 问题内容: 让我们假设两个接口: 现在,我要创建一个工厂(例如,…),但是对于两个接口的实现类都不是必需的(例如在java参数化的通用静态工厂中)。本应以这种方式工作(其中农具和工具): 这应该是工厂: 我收到此错误的地方: 顺便说一句:是否可以使该方法静态? 问题答案: 由于Java中的泛型是使用擦除来实现的,因此的类型信息将在运行时不可用,这意味着您无法以这种方式实例化(或)。 但是,您 可以

  • 问题内容: 首先,我阅读了埃里克森对“为什么不能在Java接口中定义静态方法?”的有用答复。。这个问题不是关于“为什么”的问题,而是关于“然后如何做”的问题。 编辑:我的原始示例不适当地,但我将其保留在下面。 虽然我现在确信在大多数情况下我想做的是过度矫kill过正,但在一种情况下可能需要这样做: 我再举一个例子。现在,让我们采用一个适合于查找表的复杂功能,例如Bessel函数。这必须进行初始化,

  • 此具有方法 我迷路了...有人能解释一下吗

  • 问题内容: 我的应用程序有一个问题,当我登录时,该应用程序崩溃并且出现错误: 我试图弄乱gradle并更改变量。这个问题似乎源于此软件包: 然后,它还引用了以下内容: 这是我的摇篮 关于如何找到纠正错误的方法有任何想法吗? 问题答案: 尝试切换到Java 8兼容性,以对某些库进行适当的除糖处理: 此外,Google JSON API可能更需要。