Generics angle brackets before static function cal

2020-03-31 02:25发布

I have always used generics and always seen the angle brackets used like this: Class<Type> (e.g. List<String>).

Today I encountered a generics specification before the call of a static method like: Class.<TypeA, TypeB>staticCall(). The real example is: ImmutableMap.<String, String>builder().

I've never seen this usage and I can't find this specific usage in the documentation. Can someone explain what is going on, please?

3条回答
啃猪蹄的小仙女
2楼-- · 2020-03-31 03:08

Those are called Generic Methods.

Before Java 7 you had to specify the type of the Generic reference:

Util.<Integer, String>compare(p1, p2);

Now the compiler infers the type from the context.

查看更多
三岁会撩人
3楼-- · 2020-03-31 03:17

It's signifying multiple types. List only takes one generic type which is why you see

List<String>

From the java docs for Map

At the top you'll see: Interface Map

so it takes two generic types. In the example of your Immutable map, it's saying that the K(ey) is a String and V(alue) is also a String.

In the link you provided, it mentions that this is possible under section,

A Generic Version of the Box Class

查看更多
疯言疯语
4楼-- · 2020-03-31 03:22

we can define generics on class level also .

ImmutableMap.Builder means Builder is inner static class here .

and Builder methods will have K and V as arguments means

means instead providing put(String , String) it provides methos like put(K,V) so that any type can be added using put and if you get you need use the same type.

for example if your are calling Builder.Put by passing string , String then in get we can directly assign to String

String val = Bullder.get(K);

it means all methods of ImmutableMap.Builder will work for any class type.

that is the power of generics meaning no need to overlaod methods for different type. just define like below:

public Builder<K, V> put(K key, V value) {
  ensureCapacity(size + 1);
  ImmutableMapEntry<K, V> entry = entryOf(key, value);
  // don't inline this: we want to fail atomically if key or value is null
  entries[size++] = entry;
  return this;
}
查看更多
登录 后发表回答