【问题标题】:Scala, advanced generic extendingScala,高级通用扩展
【发布时间】:2010-11-26 13:07:30
【问题描述】:

我正在尝试将 https://gist.github.com/319827 重写为 Scala。但我无法编译它。正确的语法是什么?

我总是得到错误:

需要类类型但 java.util.Comparator[_ >: java.lang.Comparable[java.lang.Object]] 找到

来源:

package v6ak.util

import java.util.Comparator

object NaturalComparator extends Comparator[_ >: Comparable[Object]]{

    override def compare(o1:Comparable[Object], o2:Comparable[Object]) = {
        if( o1==null || o2==null ){
            throw new NullPointerException("Comparing null values is not supported!");
        }
        o1.compareTo(o2);
    }

}

【问题讨论】:

    标签: generics scala extending


    【解决方案1】:

    A extends B 在 Scala 中写为 A<:B 而不是 A>:B

    顺便说一句,scala 类型系统足够强大,可以避免在代码中使用 Object(scala 中的 AnyRef)

    package v6ak.util
    
    import java.util.Comparator
    
    class NaturalComparator[T <: Comparable[T]] extends Comparator[T] {
      override def compare(o1: T, o2: T) = {
        if (o1 == null || o2 == null) {
          throw new NullPointerException("Comparing null values is not supported!");
        }
        o1.compareTo(o2);
      }
    }
    
    object StringComparator extends NaturalComparator[String]
    
    object Examples {
      StringComparator.compare("a", "b")
      StringComparator.compare(2, "b") // error
    }
    

    【讨论】:

    • 嗯,这不是我想要的代码。我真的很讨厌专业化(比如 ObjectPascal 中的专业化)。
    • 您可以编写不太专业的代码,但您会在编译时失去类型安全性。您是否真的希望被允许编写代码来比较 DateFile,这只会在运行时失败?
    • 嗯,但原始 Java 代码并非如此。我认为我可以在 Scala 中编写类似于 Java 代码的东西,但它不是很好。
    【解决方案2】:

    好吧,你把那个 java 版本弄得一团糟。请注意,您创建了 Comparator> 的一个实例,并使用通配符将其分配给 value - 为什么?您不会为该变量分配任何其他内容。不是说您的 getInstance 还定义了通配符,而它返回的所有内容都相同 Comparator>

    所以:

    object NaturalComparator extends Comparator[Comparable[Object]]{
        override def compare(o1:Comparable[Object], o2:Comparable[Object]) = {
            if(o1 == null || o2 == null){
                throw new NullPointerException("Comparing null values is not supported!");
            }
            o1.compareTo(o2);
        }
    }
    

    【讨论】:

    • 这是一种允许拥有单个实例并将其用于各种类型的方法。它事实上是兼容的,但是如果没有@SuppressWarning,Java 就无法解释它。我不认为这是一团糟。你的代码不是我想要的代码。以下代码不起作用:gist.github.com/d2d24794f61b5afb7d57
    【解决方案3】:

    我用更多的经验和solved it 回到了这个问题,尽管我认为这可以更好。

    package v6ak.util
    
    import java.util.Comparator
    
    object NaturalComparator extends Comparator[Comparable[Any]]{
    
        def apply[T]() = asInstanceOf[Comparator[T]]
    
        override def compare(o1:Comparable[Any], o2:Comparable[Any]) = {
            if( o1 == null || o2 == null ){
                throw new NullPointerException("Comparing null values is not supported!")
            }
            o1 compareTo o2
        }
    
    }
    

    【讨论】:

    • 你是对的,apply 方法不会强制执行像 > 之类的东西。但这可能会改变。
    猜你喜欢
    • 1970-01-01
    • 2016-07-08
    • 2020-08-21
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多