泛型和工厂方法
Generics and factory method
我有两个简单的 类 扩展接口:
public interface Product
{
}
public class ProductA implements Product
{
}
public class ProductB implements Product
{
}
我有两个'services'类:ServiceA和ServiceB。每个都与之前定义的产品 类 之一一起使用。两者都实现了服务接口。
public interface Service<T extends Product>
{
public void print (T product);
}
public class ServiceA implements Service<ProductA>
{
public void print (ProductA product)
{
System.out.println("Product A");
}
}
public class ServiceB implements Service<ProductB>
{
public void print (ProductB product)
{
System.out.println("Product B");
}
}
我想开发一个工厂来实例化我的服务:
[在我找到解决方案之前]
public class FactoryService
{
public static Service<? extends Product> getService (String serviceType)
{
Service<? extends Product> s = null;
if ("1".equals(serviceType))
s = new ServiceA();
else if ("2".equals(serviceType))
s = new ServiceB();
return s;
}
}
[解决方案]
public static <T> T getService (Type targetType)
{
T service = null;
if (!targetType.getClass().isInstance(Product.class))
throw new RuntimeException();
if (ProductA.class.getTypeName().equals(targetType.getTypeName()))
service = (T) new ServiceA();
else if (ProductB.class.getTypeName().equals(targetType.getTypeName()))
service = (T) new ServiceB();
return service;
}
当我尝试使用我的工厂时出现编译错误:
[在我找到解决方案之前]
public static void main(String[] args)
{
Product pA = new ProductA();
Product pB = new ProductB();
Service<? extends Product> service = FactoryService.getService("1");
service.print(pA);
}
[解决方案]
public static void main(String[] args)
{
Product pA = new ProductA();
Product pB = new ProductB();
Service<Product> service = FactoryService.getService(pA.getClass());
service.print(pA);
service = FactoryService.getService(pB.getClass());
service.print(pB);
// No compilation errors
}
错误说:
Service 不适用于参数 (Product)。
我该如何解决这个问题?
谢谢
当您想在声明类型时使用泛型时,您不应像 Jesper 指出的那样使用 <? extends Type>
。相反,您应该使用 <Type>
。在您的情况下,将 Service<? extends Product>
替换为 Service<Product>
.
现在你会得到另一个错误:
Type mismatch: cannot convert from ServiceA to Service<Product>
我建议的解决方案不是定义 ServiceA
和 ServiceB
,而是使用 Service#print
方法并检查泛型类型,然后执行必要的操作。在这种情况下不需要 FactoryService#getService
方法。
剧透我的解决方案(先尝试不使用它):
public class Service<T extends Product> {
public void print(T product) {
if (product instanceof ProductA) {
System.out.println("Product A");
} else if (product instanceof ProductB) {
System.out.println("Product B");
}
}
}
我有两个简单的 类 扩展接口:
public interface Product
{
}
public class ProductA implements Product
{
}
public class ProductB implements Product
{
}
我有两个'services'类:ServiceA和ServiceB。每个都与之前定义的产品 类 之一一起使用。两者都实现了服务接口。
public interface Service<T extends Product>
{
public void print (T product);
}
public class ServiceA implements Service<ProductA>
{
public void print (ProductA product)
{
System.out.println("Product A");
}
}
public class ServiceB implements Service<ProductB>
{
public void print (ProductB product)
{
System.out.println("Product B");
}
}
我想开发一个工厂来实例化我的服务:
[在我找到解决方案之前]
public class FactoryService
{
public static Service<? extends Product> getService (String serviceType)
{
Service<? extends Product> s = null;
if ("1".equals(serviceType))
s = new ServiceA();
else if ("2".equals(serviceType))
s = new ServiceB();
return s;
}
}
[解决方案]
public static <T> T getService (Type targetType)
{
T service = null;
if (!targetType.getClass().isInstance(Product.class))
throw new RuntimeException();
if (ProductA.class.getTypeName().equals(targetType.getTypeName()))
service = (T) new ServiceA();
else if (ProductB.class.getTypeName().equals(targetType.getTypeName()))
service = (T) new ServiceB();
return service;
}
当我尝试使用我的工厂时出现编译错误:
[在我找到解决方案之前]
public static void main(String[] args)
{
Product pA = new ProductA();
Product pB = new ProductB();
Service<? extends Product> service = FactoryService.getService("1");
service.print(pA);
}
[解决方案]
public static void main(String[] args)
{
Product pA = new ProductA();
Product pB = new ProductB();
Service<Product> service = FactoryService.getService(pA.getClass());
service.print(pA);
service = FactoryService.getService(pB.getClass());
service.print(pB);
// No compilation errors
}
错误说:
Service
我该如何解决这个问题?
谢谢
当您想在声明类型时使用泛型时,您不应像 Jesper 指出的那样使用 <? extends Type>
。相反,您应该使用 <Type>
。在您的情况下,将 Service<? extends Product>
替换为 Service<Product>
.
现在你会得到另一个错误:
Type mismatch: cannot convert from ServiceA to Service<Product>
我建议的解决方案不是定义 ServiceA
和 ServiceB
,而是使用 Service#print
方法并检查泛型类型,然后执行必要的操作。在这种情况下不需要 FactoryService#getService
方法。
剧透我的解决方案(先尝试不使用它):
public class Service<T extends Product> {
public void print(T product) {
if (product instanceof ProductA) {
System.out.println("Product A");
} else if (product instanceof ProductB) {
System.out.println("Product B");
}
}
}