我们可以使用泛型只允许特定类型而不是任何类型<t>吗?

时间:2018-02-16 10:00:15

标签: java generics

假设我有三个孤立的公共类(没有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时生成编译器错误。

3 个答案:

答案 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> { ... }

作为基本类型的classinterface工作。

答案 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>中使用。