我有以下静态工厂实现:
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方法?
虽然不是很优雅,但以下修改应该有效:
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可能更需要。