Java Interview Question

Use this advanced question and answer to prepare for your next Java interview.

Is the code compile-time and run-time safe? What do I and K stand for? What is the use of the extends keyword in both places? Explain the get method definition. Explain the wildcard symbols.

class A<K, I extends List<K>> {
  public K get(final int index, final I list) {
    return list.get(idx);
  }
}

class B extends A<String, LinkedList<String>> { }

Class C {
  public static void main(String...args) {
    A<Integer, ArrayList<Integer>> a = new A<>;
    B b = new B();
    A<?, ?> g;
    A<? extends Integer, ?> f;
    g = a;
    g = b;
    f = a;
  }
}


Yes, this code is compile-time and run-time safe.

I and K are Generic type parameters used to ensure type safety.

The extends keyword in the first line defines the scope of the I parameter. The I parameter can only be a sub-type of List of type K. K by default extends Object.

The second extends keyword is used for inheriting class A and fixing the type parameters of A to String and LinkedList.

The get method takes an index integer and a List of type K as the parameters. It returns the list value at index, which will have a return type K because the list parameter is fixed to K.

For example, when get is called on instance b of class B, get will take a LinkedList<String> and return the String at index.

The wildcard symbols indicate that g can have any type within the bounds of the parameters. That is why a and b can be assigned to it. In the case of f, the first parameter gets limited to Integer sub-types, so only a can be assigned to it, not b. f can be assigned to g, but not the other way round.

Looking for developers?

Want to learn more about Gigster? Enter your email and one of our project engineers will be in touch.