Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extending Generic Classes

public class MyGeneric<T, E> {}  public class Extend1<T, E> extends MyGeneric<T, E> {}  public class Extend2 extends MyGeneric<String, Object> {} 

As far as I am aware, both of the subclasses in the above example are valid. I was wondering how Java knows when the types given in the superclass are going to be defined when the subclass is instantiated, and when they are actual class names (i.e. How does it know T, E are not class names)?

A side note, is it permissible (even if uncommon) to use more than one letter for the generic types? What if (through some sever error of planning) The types conflict with an existing class e.g.

public class E{} public class Foo<E>{} 

what happens then?

Edit: Thanks for answering so promptly. To answer my first question, Joachim's answer is most effective.

To answer the side point, aioobe's answer is clearer

like image 270
James Avatar asked Aug 31 '11 10:08

James


People also ask

Can we extend generic class?

Yes, you can use any valid Java identifier for type parameters.

What is generic classes in Java?

A Generic class simply means that the items or functions in that class can be generalized with the parameter(example T) to specify that we can add any type as a parameter in place of T like Integer, Character, String, Double or any other user-defined type.

What does it mean to extend class?

Definition and Usage The extends keyword extends a class (indicates that a class is inherited from another class). In Java, it is possible to inherit attributes and methods from one class to another. We group the "inheritance concept" into two categories: subclass (child) - the class that inherits from another class.

What is meant by generic class?

Generic classes encapsulate operations that are not specific to a particular data type. The most common use for generic classes is with collections like linked lists, hash tables, stacks, queues, trees, and so on.


1 Answers

Let's look at this definition:

public class Extend1<T, E> extends MyGeneric<T, E> {} 

Here T and E are each present twice and in two different roles

  • in Extend1<T,E> you define type arguments. This means that the type Extend1 has two (unbounded) type arguments T and E. This tells the Java compiler that those who use Extend1 need to specify the types.
  • in extends MyGeneric<T,E> you use the previously defined type arguments. If T and E were not known to be type arguments here, then T and E would be simple type references, i.e. the compiler would look for classes (or interfaces, ...) named T and E (and most likely not find them).

Yes, type arguments follow the same syntactic rules as any other identifier in Java, so you can use multiple letters ABC or even names that can be confusing (using a type argument called String is legal, but highly confusing).

Single-letter type argument names are simply a very common naming strategy.

like image 197
Joachim Sauer Avatar answered Oct 22 '22 09:10

Joachim Sauer