繁体   English   中英

Java形式类型参数定义(泛型)

[英]Java formal type parameter definition (Generics)

我想定义一个泛型类型,其实际类型参数只能是

  1. 一个数字原始包装类( LongIntegerFloatDouble
  2. String

我可以通过这样的定义满足第一个要求

public final class MyClass<T extends Number> {
    // Implementation omitted
}

但我无法弄清楚如何满足他们两个。 我怀疑这实际上是不可能的,因为AFAIK在定义形式类型参数时没有办法指定“或”语义,尽管你可以使用如下的定义来指定“和”语义

public final class MyClass<T extends Runnable & Serializable > {
    // Implementation omitted
}

干杯,唐

Java泛型不支持联合类型(此参数可以是A OR B)。

在某些可能感兴趣的相关注释中,如果要强制执行多个限制,它确实支持多个边界。 以下是Java 泛型教程中提到的JDK 示例

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

您可以对所有受支持的类型使用工厂方法,并使构造函数为private / protected。 你必须在构造函数中修改泛型类型,以便它有意义,所以你可能会像这样编码:

public final class MyClass<T> {
    public static MyClass<Integer> newInstance(int i) {
        return new MyClass<Integer>(i);
    }
    public static MyClass<String> newInstance(String s) {
        return new MyClass<String>(s);
    }
    //More factory methods...

    protected MyClass(T obj) {
        //...
    }
}

或者如果你不想要构造函数参数,就像这样:public final class MyClass {public static MyClass newIntegerInstance(){return new MyClass(); } // ...}

正如erickson所说,通用实现无论如何都只能依赖于Object,因此唯一的限制是,除了原语和String之外,还可以为其他类型创建其他实现。

虽然泛型在这里不起作用,但是具有NumberString派生类型的基类型。 由于泛型类型无论如何都会擦除到Object ,因此您在其中放置的任何功能都可以放在抽象基类中。 您可能只需要子类上的特定于类型的访问器来获取值。

另外,请注意Number类。 它不仅限于装箱原始类型,因为任何人都可以扩展它 - 例如, BigInteger

也许你可以做以下事情:

  1. 使MyClass<T>成为一个包默认类,对其他组件不可见,或者至少只对包默认的ctors,因此它不能在包外扩展或实例化。
  2. MyClass<T>包中创建两个公共类:
 MyNumericClass<T extends Number> extends MyClass<T> MyStringClass extends MyClass<String> 

这样,MyClass的所有子类都将限制为使用Number子类或String进行参数化的子类。

有趣的问题,它让我感到困惑。 但显然这是不可能的。 我尝试了几种不同的黑客,没有一种真正起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM