Java 中的多态值

Polymorphic values in Java

我正在研究 Haskell 并且遇到了 多态值 。这些是根据上下文具有不同类型的值。例如,Nothing 的类型为 Maybe a[] 的类型为 [a]。所以 [] 是任何你想要的列表,你可以在任何需要列表的地方使用它。

我很难在 Java 中找到类似的东西,除了 "billion-dollar mistake" null,它基本上是任何类型。可能是带有无限制通配符的泛型是相似的,但同样,我想不出一个例子。

Java中有类似的东西吗?

[]这样的多态值只能表示为Java中的方法。其实这个方法在Arraysclass中已经存在,叫做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().

这是评论而非实际答案,但我需要更多 space。

虽然 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;
}

请注意,多态 non-function 值无法轻松转换。即使在 Haskell 中,诸如 3 :: Num a => a 之类的值也是伪装的函数。此外,[] :: [a]Nothing :: Maybe a 也被视为函数,在编译的某些阶段采用 "type" 参数——尽管 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,以及模式修补和 non-exhaustiveness 警告。在Java中可以使用so-calledVisitor pattern模拟ADT值消去,这是模式匹配的一种基本形式。