假设我有三个孤立的公共类(没有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;
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码只会在运行时抛出异常.但我更喜欢在编译时抛出错误,以便在使用除A或B之外的任何类型构造C时生成编译器错误.
使构造函数私有:
private C(T param){
Run Code Online (Sandbox Code Playgroud)
然后提供静态工厂方法来创建特定类型的实例:
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);
}
Run Code Online (Sandbox Code Playgroud)
这并不妨碍您使用该类型 C<SomeOtherType>
; 你只是无法创建它的实例.