| Wiki Markup |
|---|
The Java compiler type -checks the arguments to each varargs method to ensure that the arguments are of the same type or object reference. However, the compile-time checking is ineffective when {{Object}} or generic {{T}} parameter types are used \[java:[Bloch 2008|AA. References#Bloch 08]\]. Another requirement for providing strong compile-time type checking of variable argument methods is to be as specific as possible when declaring the type of the method parameter. |
...
This noncompliant code example declares a vararg method using Object. It accepts an arbitrary mix of parameters of any object type. Legitimate uses of such declarations are rare. (See exception below"Exceptions").
| Code Block | ||
|---|---|---|
| ||
ReturnType method(Object... args) { }
|
...
| Wiki Markup |
|---|
Retrofitting old methods containing final array parameters with generically- typed varargs is not always a good idea. For example, given a method that does not accept an argument of a particular type, it could be possible to override the compile-time checking --- through the use of generic varargs parameters --- so that the method would compile cleanly rather than correctly, causing a compile-time error \[java:[Bloch 2008|AA. References#Bloch 08]\]. |
...
DCL03-EX0: Varargs signatures using Object and imprecise generic types are acceptable when the body of the method does not use casts or auto-boxing autoboxing and compiles without error. Consider the following example, which operates correctly for all object types and type-checks successfully.
| Code Block | ||
|---|---|---|
| ||
Collection<T> assembleCollection(T... args) {
Collection<T> result = new HashSet<T>();
// add each argument to the result collection
return result;
}
|
...
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="0b19db3fc59a0977-0847adc9-44274554-94bcbe66-4e865e98079893381c8ad693"><ac:plain-text-body><![CDATA[ | [java:[Bloch 2008 | AA. References#Bloch 08]] | Item 42: "Use Varargs Judiciously" | ]]></ac:plain-text-body></ac:structured-macro> | |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="7e4c1a60984ce30c-07a75d1a-4efe4d69-9a35a5fd-150ea4fc80937ad1832b70a5"><ac:plain-text-body><![CDATA[ | [java:[Steinberg 2005 | AA. References#Steinberg 05]] | "Using the Varargs Language Feature" | ]]></ac:plain-text-body></ac:structured-macro> | |
<ac:structured-macro ac:name="unmigrated-wiki-markup" ac:schema-version="1" ac:macro-id="81380a77491a45a3-f1bd76fd-47cb4f9e-b84e90f4-5edcbb6d6f526f4775efd661"><ac:plain-text-body><![CDATA[ | [java:[Sun 2006 | AA. References#Sun 06]] | [varargs | http://java.sun.com/j2se/1.5.0/docs/guide/language/varargs.html] | ]]></ac:plain-text-body></ac:structured-macro> |
...