假设我有三个隔离的公共类(没有IS-A关系)A,B和C。我想在C中定义一个字段,使其类型可以是A或B。
目前,我通过定义C来实现这一目标:
class A{} class B{} public class C<T> { private T obj; public C(T param){ if ( !(param instanceof A) || !(param instanceof B) ) { throw new InvalidParameterException("Only types A and B are allowed!"); } this.obj = param; } }
上面的代码仅在运行时会引发异常。但是,我更希望在使用A或B以外的任何类型构造C的情况下,在编译时本身抛出错误,以生成编译器错误。
将构造函数设为私有:
private C(T param){
然后提供静态工厂方法来创建特定类型的实例:
public static <T extends A> C<T> create(T param) { return new C<>(param); } public static <T extends B> C<T> create(T param) { return new C<>(param); }
这不会阻止您使用 类型 C<SomeOtherType> ; 您只是无法创建它的实例。
C<SomeOtherType>