【发布时间】:2016-03-21 09:22:29
【问题描述】:
我有一个通用接口Handler
public interface Handler<T> {
void handle(T obj);
}
我可以有这个接口的 n 个实现。假设我现在有以下 2 个实现。一个处理字符串对象,另一个处理日期
public class StringHandler implements Handler<String> {
@Override
public void handle(String str) {
System.out.println(str);
}
}
public class DateHandler implements Handler<Date> {
@Override
public void handle(Date date) {
System.out.println(date);
}
}
我想编写一个工厂,它将根据类类型返回处理程序实例。像这样的:
class HandlerFactory {
public <T> Handler<T> getHandler(Class<T> clazz) {
if (clazz == String.class) return new StringHandler();
if (clazz == Date.class) return new DateHandler();
}
}
我在这个工厂遇到以下错误:
类型不匹配:无法从
StringHandler转换为Handler<T>
如何解决这个问题?
【问题讨论】:
-
不知道为什么要深入研究泛型。为什么不只拥有一个 getStringHandler() 方法和一个 getDateHandler() 方法并完成它?.....这样对 Factory 的用户来说更清楚。
-
你不能做你在你的例子中尝试的事情。编译器无法遵循您的逻辑,即如果
clazz是String.class则T是String。这对你来说很明显,但对编译器来说却不是。 -
@OliverWatkins 你的意思是我应该改变 Handler 接口以使用 Object 而不是类型 T 并将 Object 转换为实现类中的相应类型?但这不会违反里氏替换原则吗?
-
不,前两部分非常好。第三部分,工厂是我不太确定的地方。拥有一个 getStringHandler() 方法和一个 getDateHandler() 方法根本不会破坏 Liskov 子原则。我认为你试图在 HandlerFactory 中变得有点太聪明了......而且你没有必要以你的方式拥有 getHandler 方法。