Dan Rosenstark
Dan Rosenstark

Reputation: 69757

I Use Generics, But Not This Class<T> thing!

I am trying to call this method to concat two arrays using Google Collections

public static <T> T[] concat(T[] first,
                             T[] second,
                             Class<T> type)

It's returning empty results. I am using

ObjectArrays.concat(array1, array2, Blah.class)

which is the only thing that compiles.

array1 and array2 are of type Blah[].

What's the right syntax?

Bonus question: do other collections libraries have documentation with examples?

Edit: Problem was my bone-headed code.

public void register(ButtonPair[] pairs) {
    pairs = ObjectArrays.concat(this.pairs, pairs, ButtonPair.class);
}

the right side of the thing is okay, but the left side is not assigning to this.pairs due to the ambiguity. Sorry! And hats off to Google Collections!

Upvotes: 3

Views: 399

Answers (4)

L. Cornelius Dol
L. Cornelius Dol

Reputation: 64026

Isn't this because you are not assigning the result to the instance variable but to the method variable.

That is this:

public void register(ButtonPair[] pairs) {
    pairs = ObjectArrays.concat(this.pairs, pairs, ButtonPair.class);
    }

should be

public void register(ButtonPair[] pairs) {
    this.pairs = ObjectArrays.concat(this.pairs, pairs, ButtonPair.class);
    }

Incidentally, this is why at our shop we have have a different naming convention for method parameters and variables than that for instance variables (though not the awful prefixing/suffixing of instance variables like _someInstanceVar).

Upvotes: 0

pkaeding
pkaeding

Reputation: 37643

For some example usage of the Google Collections classes, check out the unit tests.

For example:

String[] result = ObjectArrays.concat(
    new String[] { "a", "b" }, new String[] { "c", "d" }, String.class);
assertEquals(String[].class, result.getClass());
assertContentsInOrder(Arrays.asList(result), "a", "b", "c", "d");

So, what the Class<T> notation means is that it needs you to specify what class the objects in the other two argument arrays belong to.

Upvotes: 3

amarillion
amarillion

Reputation: 24927

Your syntax looks totally correct. I think the problem must be elsewhere. Are you 100% certain about the input values? Here is a test case:

import com.google.common.collect.ObjectArrays;

public class ObjectArrayTest
{
    public static void main(String[] args)
    {
        String[] first = new String[] { "Fire", "Earth" };
        String[] second = new String[] { "Water", "Air" };

        String[] result = ObjectArrays.concat(first, second, String.class);

        for (String s : result)
        {
            System.out.println (s);
        }
    }
}

Upvotes: 1

teto
teto

Reputation: 4109

The following worked for me:


String[] arr1 = { "abc", "def" };
String[] arr2 = { "ghi", "jkl" };
String[] result = ObjectArrays.concat(arr1, arr2, String.class);

How are you getting the result from concat()?

Upvotes: 3

Related Questions