使用此课程:
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
从不包含异常对象吗?
答案 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 ++的演变,是前进一步和后退两步的案例。