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

ImG*_*oot 2 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;
    }

} 
Run Code Online (Sandbox Code Playgroud)

上面的代码只会在运行时抛出异常.但我更喜欢在编译时抛出错误,以便在使用除A或B之外的任何类型构造C时生成编译器错误.

And*_*ner 5

使构造函数私有:

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

  • 辉煌!!谢谢 :) (2认同)
  • @Jayanth你只能在类型变量的声明中使用extends; 而且,`T`不在那里,因为它是一种静态方法. (2认同)