当前位置: 首页 > 面试题库 >

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

常嘉平
2023-03-14
问题内容

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


问题答案:

将构造函数设为私有:

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



 类似资料:
  • 问题内容: 说,我有如下通用类型 我想让它只接受特定的类型(字符串/整数/双精度)。我知道有界通配符,但在这里对我没有帮助。在setVar()中,如果类型不是Integer / String等,我可以检查并引发异常。这是最好的方法吗? 在对此类型进行操作时,我遇到同样的问题。根据类型,我想执行不同的操作。继承和有界通配符似乎通常是解决此类问题的方法,但它们是原始包装器。 问题答案: 使用继承: P

  • 我正在尝试有一个通量通用转换器使用通用类型在Java 8。我把我的代码建立在这个答案的基础上。其思想基本上是实现这个特定的转换器->: 类型转换器->转换为我想要的任何类型。因此,我正在使用构造函数创建一个类型为的类,并返回一个方法。我想在调用上创建类似这样的多个条目:,但类类型不同。但它甚至对整数也不起作用。 当我使用此单元测试进行测试时,我得到错误:。

  • 我有一个有界泛型类,我们称之为泛型,它的参数T扩展了抽象类abstract: 泛型类: 抽象类 泛型类中T引用的类 当尝试引用方法 getMap() 时,该方法来自 T 边界内的类(并且根据抽象类定义,T 的所有可能实例都将具有该方法),我收到以下错误: 不能从静态上下文引用非静态方法getMap() 然而,任何地方都没有静态关键字。我错过了什么?? 谢谢!

  • 问题内容: 我上课了。我怎么能说我想成为某个班级的实施者?编写根本无法编译。 问题答案: 使用代替。

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我试图实现一个接受泛型参数的函数定义,只要它扩展了另一个特定的泛型类型。简言之参数A必须扩展参数B,其中A和B都是泛型的。 下面是我的示例 用法示例如下 一些封闭的班级 和函数调用 我不想在抽象类声明中定义E,因为T已经在那里定义了。 我也试着做了以下几点: 将myList定义为接受扩展T的键 将E定义为T类型(无法找到如何指定它在函数中扩展T 但它从来都不起作用。有没有办法做到这一点?我在Sta