繁体   English   中英

Java中的多态值

[英]Polymorphic values in Java

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

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

Java中有类似的东西吗?

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

虽然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也被视为函数,在编译的某些阶段采用“类型”参数 - 虽然,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中,您可以使用所谓的访问者模式来模拟ADT值消除,这是模式匹配的基本形式。

[]这样的多态值只能表示为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()

暂无
暂无

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

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