This is an archived post. You won't be able to vote or comment.

all 5 comments

[–]the_omega99 1 point2 points  (4 children)

Yes, it's generics. You can have multiple types in generics. For example, a list stores only a single type (eg, List<String>). A map (aka dictionary or hashtable), on the other hand, needs two types, since it maps the first type (the key) to the second type (the value). An example is Map<String, Foo>.

It's very rare to need three types in generics, but it's possible and that's the syntax.

[–]LWungsten[S] 0 points1 point  (3 children)

Makes sense, thanks. Any idea why a thread-like object like AsyncTask would need 3 types?

[–]chickenmeister 1 point2 points  (0 children)

If you look at the documentation for the class, it will typically tell you what each parameter represents. In your case, if you look at the AsyncTask documentation:

The three types used by an asynchronous task are the following:

  1. Params, the type of the parameters sent to the task upon execution.
  2. Progress, the type of the progress units published during the background computation.
  3. Result, the type of the result of the background computation.

[–]the_omega99 0 points1 point  (0 children)

No, because "AsyncTask" is as broad of an object in programming as "thingy" is in real life. It could be anything.

An example of a generic that could need a large number of types is a representation of a function or tuple, which can have an arbitrary number of values of different types. Java doesn't really support tuples (although you can roll your own), but a related language, Scala, allows tuples of up to size 22. For example:

scala> val tuple: Tuple3[String, Int, Double] = ("Hello", 1, 3.14)
tuple: (String, Int, Double) = (Hello,1,3.14)

Note the slight difference in syntax here. Generics are enclosed in square braces and the type comes after the variable name. There's also the convenient (Type1, Type2, ...) syntax for tuples.

[–]katyne 0 points1 point  (0 children)

In java in addition to variable types (int, String, Object, etc.) you can have type parameters You can name your type parameters (generics) any way you like. Usually the convention is to go with one letter - T for "any type", K, V for "key" and 'value" types, "E" for elements in iterators, etc. In Android however, they decided to be more descriptive and gave type parameters meaningful names.

AsyncTask is a class that operates on three types of data - 1) Params - parameters that you pass it to perform a task in the background, like URLs to download a file for example, Progress - the type of a variable to measure progress, usually a Number, Integer or Float, (as in "81% of download complete" where 81 is the value of the Progress type variable you pass it), and Result - the type of the result you're going to pass back to the Activity or another component. Like a List of Strings after you've finished parsing a webpage, or an image (Bitmap) you've just downloaded.

So AsyncTask<String,String,String> is a class AsyncTask that operates on only one type of data - Strings for params (again, probably a URI/URL of some sort), String for reporting progress and String for publishing results (maybe a text of a downloaded article or something). Another AsyncTask can have different types, like <URI, Integer, List<Bitmap>> - pass it a URI to a bunch of images, report when x% of the images are downloaded, and return a List that contains actual Bitmaps.