奇怪的Java通用
这是什么意思?
HashBiMap charOcc = HashBiMap. create();
create()
是一种通用方法。 因为它是静态的并且没有参数(因此没有类型推断),所以你能告诉它通用参数是什么的唯一方法是看起来奇怪的.
语法。
编辑:在这种特定情况下,这实际上是不必要的; 编译器可以从左侧推断generics类型。 但有时在其他情况下有必要,例如这个问题: Java中没有generics参数的通用方法
它使用Character
和Integer
作为类型参数调用generics静态方法( create()
)。 例如,如果您正在查看Google Java Collections,则声明具有以下签名:
public static HashBiMap create()
部分自身指定那些是该方法的类型参数。
C#中的等效调用将是以下之一:
HashBiMap.Create(); HashBiMap.Create();
取决于您是希望它是非generics类型中的generics方法,还是generics类型中的非generics方法。
在Java中定义类型参数和类型参数是不直观的IMO。
这意味着static create()
方法具有类型参数,如:
public static HashBiMap create() {..}
据推测,你认为它是右手边(RHS)很奇怪
HashBiMap. create();
通常,在调用通用静态方法时,只需要在LHS上使用类型参数。 但有时静态方法不会按预期推断类型参数。 在这些情况下,您还可以使用RHS上的类型参数,以便将类型参数强制转换为您想要的任何内容。 这称为显式类型参数 。
下面是一个未正确推断类型参数的示例(改编自优秀的“Effective Java”书):
例
给出静态方法
public static Set union(Set extends E> s1, Set extends E> s2)
你可能认为你可以这样做:
Set integers = ... ; Set doubles = ... ; Set numbers = union(integers, doubles);
如果您尝试它,您将收到此错误消息:
Union.java:14: incompatible types found : Set>> required: Set Set numbers = union(integers, doubles);
如果编译器没有推断出你希望它具有的类型,你可以告诉它使用显式类型参数的类型。 通过添加此显式类型参数,程序可以干净地编译:
Set numbers = Union. union(integers, doubles);
HashBiMap可能有一个方法
public static HashBiMap create(){...}
使用语法
HashBiMap charOcc = HashBiMap. create();
你正在传递K的字符和V的整数。
如果您希望避免使用提供forms参数的繁琐语法,可以使用强制转换来键入提示。
用你的例子,
Set integers = ... ; Set doubles = ... ; Set numbers = union((Set )integers, doubles);
这将被编译器接受并避免必须使用
Set numbers = Union. union(integers, doubles);