Java中的多态值

dam*_*uar 3 java polymorphism haskell types parametric-polymorphism

我正在研究Haskell并遇到了多态值.这些是具有不同类型的值,具体取决于上下文.例如,Nothing有类型Maybe a[]有类型[a].[]所有你想要的列表也是如此,你可以在任何预期的列表中使用它.

我很难在Java中找到类似的东西,除了"十亿美元的错误" null,这基本上是任何类型的.可能是与无界通配符相似的泛型,但再次,我想不出一个例子.

Java中有类似的东西吗?

chi*_*chi 6

这是一个评论而不是一个实际的答案,但我需要更多的空间.

虽然Java和Haskell的类型系统相距很远,但在某些特性中可以找到一些相似之处.以下是一些示例:请记住,下面显示的相关结构之间没有完美的对应关系.

多态函数(如在FP中,而不是OOP多态):

fst :: forall a b. (a, b) -> a
fst (x,y) = x
Run Code Online (Sandbox Code Playgroud)
<A,B> A fst(A a, B b) {
    return a;
}
Run Code Online (Sandbox Code Playgroud)

请注意,多态非函数值不能轻易转换.即使在Haskell中,诸如3 :: Num a => a伪装之类的值也是如此.此外,[] :: [a]并且Nothing :: Maybe a也被视为函数,在编译的某些阶段采用"类型"参数 - 尽管IIRC在运行时这些参数消失.

输入参数:

data T a = T a Int a
Run Code Online (Sandbox Code Playgroud)
class T<A> {
    A x;
    int n;
    A y;

    T(A x, int n, A y) {
        this.x = x; this.n = n; this.y = y;
    }
}
Run Code Online (Sandbox Code Playgroud)

代数数据类型(例如,data具有许多构造函数):这些在Java中不是直接可用的.其他一些JVM语言(如Scala)直接支持该语言的ADT,以及模式修补和非详尽性警告.在Java中,您可以使用所谓的访问者模式来模拟ADT值消除,这是模式匹配的基本形式.