Java中的多态值

Java中的多态值,java,haskell,types,polymorphism,parametric-polymorphism,Java,Haskell,Types,Polymorphism,Parametric Polymorphism,我在研究Haskell,发现了多态值。这些值根据上下文具有不同的类型。例如,Nothing具有类型可能是a或[]具有类型[a]。所以,[]是您想要的任何东西的列表,您可以在任何需要列表的地方使用它 除了基本上属于任何类型的“十亿美元错误”null,我很难在Java中找到类似的东西。可能是泛型和无界通配符是相似的,但我想不出一个例子 Java中有类似的东西吗?像[]这样的多态值在Java中只能表示为一个方法。事实上,此方法已经存在于数组类中,称为asList。由于Java的类型推断,您甚至不需要提

我在研究Haskell,发现了多态值。这些值根据上下文具有不同的类型。例如,
Nothing
具有类型
可能是a
[]
具有类型
[a]
。所以,
[]
是您想要的任何东西的列表,您可以在任何需要列表的地方使用它

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


Java中有类似的东西吗?

[]
这样的多态值在Java中只能表示为一个方法。事实上,此方法已经存在于
数组
类中,称为
asList
。由于Java的类型推断,您甚至不需要提供类型参数:

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

public class Test {
    public static void main(String[] args) {
        List<String> myList = Arrays.asList();
    }
}
导入java.util.array;
导入java.util.List;
公开课考试{
公共静态void main(字符串[]args){
List myList=Arrays.asList();
}
}

如果忽略所有噪音,
[]
Arrays.asList()
这与其说是一个实际答案,不如说是一个注释,但我需要更多的空间

虽然Java和Haskell的类型系统相差甚远,但在某些特性中可以找到一些相似之处。这里有几个例子:请记住,下面显示的相关结构之间没有完美的对应关系

多态函数(如FP,而非OOP多态):

fst::对于所有a b。(a,b)->a
fst(x,y)=x

模拟ADT值消除,这是模式匹配的一种基本形式。

给定的
null
是许多语言中最常用和重复使用的技术之一,一个十亿美元的错误可能会引起轰动,一些人与之斗争,特别是初学者,但我不认为这是一个问题。
对象
引用可以指向任何对象类型。我认为泛型是最接近的东西,但它还有很长的路要走。但是,总的来说,我不认为从两个这样不同的范式中一对一地映射想法是一个很有成效的想法。例如,在继承中内置了一种多态性,
Object
类型的变量可以保存任何值,但它不能反过来工作。这是否有助于您更好地理解Haskell或Java?我对此表示怀疑。多态性值通过参数多态性工作,而Java没有参数多态性。因此,这基本上是不可能的,正如继承在C中是“不可能的”:您当然可以用几种方法()来模拟它,但这是否合理,或者您是否可以使用更惯用的方法来做得更好,这是值得怀疑的。泛型是参数多态性的一种形式。这更多的是一个语法和类型推断的问题。您可能想看看好的答案。但是我想最好使用
Collections.emptyList()
,因为
Arrays.asList()
每次调用它时都会分配一个新对象。但是,
Collections.emptyList()
是不可变的。第一个示例的问题是
fst
在Java中不是一个值。像
YourClass::fst
这样的方法引用是,但它不是多态的:它只有在推断
A
B
时才起作用。