动态调度,重载和泛型

时间:2016-09-22 12:15:42

标签: java generics dispatch

使用此课程:

public class Fallible<T> {

    private final Exception exception;
    private final T value;

    public Fallible(final T value) {
        this.value = value;
        this.exception = null;
    }

    public Fallible(final Exception exception) {
        this.value = null;
        this.exception = exception;
    }

}

我可以安全地假设value 从不包含异常对象吗?

2 个答案:

答案 0 :(得分:3)

不,你不能做出这样的假设。例如:

Object obj = new Exception();
Fallible f = new Fallible(obj);

将调用泛型构造函数。

检查此问题的唯一方法是使用value明确检查instanceof的类型:

public Fallible(final T value) {
  if (value instanceof Exception) {
    this.exception = (Exception) value;
    this.value = null;
  } else {
    this.value = value;
    this.exception = null;
  }
}

答案 1 :(得分:2)

不,你不能。

如果您考虑运行时获取的类型擦除版本,则更容易分析:

public Fallible(final T value)变为public Fallible(final java.lang.Object value)

如果匹配更好,将使用重载Fallible(final Exception exception);即exception类型为Exception或其子类。

在Java中构建一个允许从java.lang.Object进行构造但禁止从子类构造(在编译时)的类。您必须依赖运行时检查(instanceof&amp; c。)。顺便说一句,你可以使用模板在C ++中解决这个问题。在这个以及许多其他方面,Java被认为是C ++的演变,是前进一步和后退两步的案例。