提供类型安全的方法是否有用?

时间:2015-10-03 09:15:08

标签: java interface casting

我正在设计界面如下:

public interface Parameters {

    public <T> T getValue(ParameterName pn, Class<T> valueType) throws ClassCastException;
}

如果要返回的值的ClassCastException实例不是作为参数传递的Class的{​​{3}},则实现有义务抛出Class

它能成为sesnse吗?它提供了编译时类型安全性,但我们可以通过显式强制转换来完成相同的操作。

或者宣布只是

要好得多
public Object getValue(ParameterName pn)

将所有类别转换问题留给客户。

2 个答案:

答案 0 :(得分:2)

我已经使用了这种形式的API,我添加了将类型转换为所需类型的功能。例如如果它是一个字符串,但你需要一个整数,它将尝试解析它。

否则,正如您所建议的那样,这种方法并没有增加太多。

 public <T> T getValue(ParameterName pn);

这避免了需要明确的演员。

答案 1 :(得分:2)

通过将预期返回类型的Class对象作为参数传递,您获得任何编译时类型安全性是一种误解。如果客户端传递错误类型的Class,则只会在运行时检测到错误。

但我认为带Class参数的设计还有其他优点:

  • 参数创建了一个自然的位置来记录方法关于返回类型的行为。
  • 您可以在方法中编写代码来检查Class参数,并在用户出错时提供具体且有意义的错误消息。
  • 在调用代码中非常明显,并引起对方法行为的注意。

我可以想到这种设计的两个缺点:

  • 参数的存在可能会给用户一个参数影响方法返回值的印象。
  • 比他在答案中建议的那样使用不受限制的通用返回类型更加冗长。