Java 中的多态值
Polymorphic values in Java
我正在研究 Haskell 并且遇到了 多态值 。这些是根据上下文具有不同类型的值。例如,Nothing
的类型为 Maybe a
或 []
的类型为 [a]
。所以 []
是任何你想要的列表,你可以在任何需要列表的地方使用它。
我很难在 Java 中找到类似的东西,除了 "billion-dollar mistake" null
,它基本上是任何类型。可能是带有无限制通配符的泛型是相似的,但同样,我想不出一个例子。
Java中有类似的东西吗?
像[]
这样的多态值只能表示为Java中的方法。其实这个方法在Arrays
class中已经存在,叫做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值消去,这是模式匹配的一种基本形式。
我正在研究 Haskell 并且遇到了 多态值 。这些是根据上下文具有不同类型的值。例如,Nothing
的类型为 Maybe a
或 []
的类型为 [a]
。所以 []
是任何你想要的列表,你可以在任何需要列表的地方使用它。
我很难在 Java 中找到类似的东西,除了 "billion-dollar mistake" null
,它基本上是任何类型。可能是带有无限制通配符的泛型是相似的,但同样,我想不出一个例子。
Java中有类似的东西吗?
像[]
这样的多态值只能表示为Java中的方法。其实这个方法在Arrays
class中已经存在,叫做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值消去,这是模式匹配的一种基本形式。