假设我有三个孤立的公共类(没有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时生成编译器错误。
答案 0 :(得分:5)
使构造函数成为私有的:
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>
;你无法创建它的实例。
答案 1 :(得分:0)
你不能这样做但你可以设置边界你想接受的类型。
如果你有
class A extends BaseType {}
class B extends BaseType {}
您可以将班级C
定义为
class C<T extends BaseType> { ... }
作为基本类型的class
或interface
工作。
答案 2 :(得分:0)
您可以使用标记接口:
interface AllowedInC {
// intentionally empty because it will be used as a mere marker
}
class A implements AllowedInC {
...
}
class B implements AllowedInC {
...
}
class C<T extends AllowedInC> {
...
}
只有A类或B类(或实施AllowedInC
的其他类)才能在C<T>
中使用。