奇怪的Java通用

这是什么意思?

HashBiMap charOcc = HashBiMap. create(); 

create()是一种通用方法。 因为它是静态的并且没有参数(因此没有类型推断),所以你能告诉它通用参数是什么的唯一方法是看起来奇怪的.语法。

编辑:在这种特定情况下,这实际上是不必要的; 编译器可以从左侧推断generics类型。 但有时在其他情况下有必要,例如这个问题: Java中没有generics参数的通用方法

它使用CharacterInteger作为类型参数调用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 s1, Set 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);