Java中的多态值

时间:2016-01-19 20:15:47

标签: java haskell types polymorphism parametric-polymorphism

我正在学习Haskell,并且遇到了多态值。这些是具有不同类型的值,具体取决于上下文。例如,Nothing类型Maybe a[]类型[a]。因此[]是您想要的任何列表,您可以在任何预期列表的任何位置使用它。

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

Java中有类似的内容吗?

2 个答案:

答案 0 :(得分:6)

这更多是评论而不是实际答案,但我需要更多空间。

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

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

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

请注意,多态非函数值无法轻易转换。即使在Haskell中,诸如3 :: Num a => a之类的值也是伪装的函数。此外,[] :: [a]Nothing :: Maybe a也被视为函数,采用&#34;类型&#34;编译的某些阶段的参数 - 虽然,IIRC在运行时这些参数消失。

输入参数:

data T a = T a Int a
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;
    }
}

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

答案 1 :(得分:2)

[]这样的多态值只能表示为Java中的方法。实际上,此方法已存在于Arrays类中,并称为asList。而且由于Java的类型推断,你甚至不需要提供类型参数:

import java.util.Arrays;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<String> myList = Arrays.asList();
    }
}

如果忽略所有噪音,[]Arrays.asList()