我正在学习Haskell,并且遇到了多态值。这些是具有不同类型的值,具体取决于上下文。例如,Nothing
类型Maybe a
或[]
类型[a]
。因此[]
是您想要的任何列表,您可以在任何预期列表的任何位置使用它。
我很难在Java中找到类似的东西,除了"十亿美元的错误" null
,基本上是任何类型的。可能是与无界通配符类似的泛型,但同样,我不能想到一个例子。
Java中有类似的内容吗?
答案 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()
。