小编典典

我们可以使用泛型来仅允许特定类型而不是任何类型吗 ?

java

假设我有三个隔离的公共类(没有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的情况下,在编译时本身抛出错误,以生成编译器错误。


阅读 217

收藏
2020-11-26

共1个答案

小编典典

将构造函数设为私有:

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> ; 您只是无法创建它的实例。

2020-11-26