Initialize Java Generic Array of Type Generic

20,027

Generics in Java doesn't allow creation of arrays with generic types. You can cast your array to a generic type, but this will generate an unchecked conversion warning:

public class HashTable<K, V>
{
    private LinkedList<V>[] m_storage;

    public HashTable(int initialSize)
    {
        m_storage = (LinkedList<V>[]) new LinkedList[initialSize];
    }
}

Here is a good explanation, without getting into the technical details of why generic array creation isn't allowed.

Share:
20,027
Abneco
Author by

Abneco

I'm a software developer who strives to solve problems in an efficient and maintainable way. I value lean/agile development practices, simplicity over complexity, and iterative continuous delivery. I'm passionate about keeping up with new languages and technologies, and discussing software development with others. View my code projects on GitHub: https://github.com/dreadwail

Updated on September 17, 2020

Comments

  • Abneco
    Abneco over 3 years

    So I have this general purpose HashTable class I'm developing, and I want to use it generically for any number of incoming types, and I want to also initialize the internal storage array to be an array of LinkedList's (for collision purposes), where each LinkedList is specified ahead of time (for type safety) to be of the type of the generic from the HashTable class. How can I accomplish this? The following code is best at clarifying my intent, but of course does not compile.

    public class HashTable<K, V>
    {
        private LinkedList<V>[] m_storage;
    
        public HashTable(int initialSize)
        {
            m_storage = new LinkedList<V>[initialSize];
        }
    }
    
  • Aaron Digulla
    Aaron Digulla almost 15 years
    You can add @SuppressWarnings({"unchecked"}) to the assignment to keep the compiler quiet.
  • Paul Bellora
    Paul Bellora over 11 years
    The page you linked to is actually not about the same thing. This section of Angelika Langer's Generics FAQ explains it well.
  • Daniel Alder
    Daniel Alder over 10 years
    If you use @SuppressWarnings({"unchecked"}) before this command to keep the compiler quiet, you can also just do @SuppressWarnings({"unchecked"}) m_storage = new LinkedList[initialSize]; which is a bit simpler and technically no difference to @SuppressWarnings({"unchecked"}) m_storage = (LinkedList<V>[]) new LinkedList[initialSize];. But I have to agree: neither of those are really nice :-(
  • Daniel Alder
    Daniel Alder over 10 years
    The link to the explanation is broken