【发布时间】:2012-06-23 18:29:14
【问题描述】:
我正在尝试通用化返回的工厂方法 一个通用的基类。它有效,但我得到了 “BaseClass 是原始类型...”警告。
我已阅读有关通用方法的 Java 文档, 但我仍然不完全了解如何做到这一点。
这里有一些代码:
第一课
//base abstract class
public abstract class BaseFormatter<T>
{
public abstract String formatValue(T value);
}
类#2
//two implementations of concrete classes
public class FooFormatter extends BaseFormatter<Integer>
{
@Override
public String formatValue(Integer value)
{
//return a formatted String
}
}
第三课
public class BarFormatter extends BaseFormatter<String>
{
@Override
public String formatValue(String value)
{
//return a formatted String
}
}
工厂方法在一个单独的类中
public static BaseFormatter getFormatter(Integer unrelatedInteger)
{
if (FOO_FORMATTER.equals(unrelatedInteger))
return new FooFormatter();
else if (BAR_FORMATTER.equals(unrelatedInteger))
return new BarFormatter();
//else...
}
从代码中的其他地方调用工厂方法
BaseFormatter<Integer> formatter = getFormatter(someInteger);
formatter.formatValue(myIntegerToFormat);
问题是 getFormatter() 方法警告 BaseFormatter 是 一个原始类型,它就是。我已经尝试过各种东西,比如 BaseFormatter 等。我当然希望返回类型是通用的,如声明的 BaseFormatter 在调用方法中。
请注意,格式化程序类型不基于类类型。例如不是所有的整数 值使用 FooFormatter 格式化。有两三个不同的 可以格式化整数(或字符串或列表)的方式。这就是 参数 unrelatedInteger 用于。
提前感谢您的任何反馈。
【问题讨论】:
-
简单的答案:Java 类型系统无法安全地表达您想要的约束。这意味着您无法摆脱此演员表的警告。