单个构造函数的泛型边界

时间:2016-03-30 21:06:05

标签: generics constructor kotlin

假设我有一个通用类:

class OrderedArray<T>(
    private val items: Array<T>,
    private val comparator: Comparator<in T>
) {
    constructor(items: Array<T>) : this(items, naturalOrder<T>())
}

当然这段代码没有编译,因为T不一定具有可比性。是否有可用的语言结构在构造函数上绑定类型的泛型参数?当自然排序可用时,我怎么能允许构造我的类的实例而不显式传递比较器?

2 个答案:

答案 0 :(得分:4)

没有办法在构造函数上引入泛型绑定,因为构造函数没有自己的泛型参数,它们只能使用类参数。

请考虑以下解决方法:

  • 一种解决方案是创建具有泛型边界的子类并使用它:

    class NaturallyOrderedArray<T: Comparable<T>>(items: Array<T>) 
        : OrderedArray<T>(items, naturalOrder<T>())
    

    但它看起来很笨(编写一个类只是为了覆盖泛型绑定并引入另一个构造函数?!)并要求父类为open或至少{{1} }。

  • 您可以使用所需的通用边界创建工厂函数:

    sealed

    您可以使该函数模仿构造函数,使其像fun <T: Comparable<T>> naturallyOrderedArray(items: Array<T>) = OrderedArray(items, naturalOrder<T>()) 一样调用,但it's better to keep to consistent naming也会暗示使用自然顺序。

答案 1 :(得分:1)

我会写得很直接:

RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

它能解决问题吗?如果没有,你的案件有哪些限制?