Generics Methoden

Hallo,

Ich wollte mal fragen ob man Generics auch für Methoden verwenden kann?

z.B. bei Helper Methoden zu Arrays wäre das irgendwie sinnvoll!

Allerdings gibt mir das hier eine Fehlermeldung:

    	return array;
    }```

Verzeiht wenn diese Frage sehr, sehr dumm ist :eek:

Klar geht das aber du benötigst vor dem Rückgabetyp noch die “definiton” der generics typen. also in deinem Fall public static <T> T[] getArray(T... array) { return array; }

AWESOME

räusper
Danke

Achso und wenn der Rückgabetype void ist?

public static void printArray(T… array)
{
//Do something
}

Das selbe
Geht genau gleich
public static void getArray(T… array)
{
//do something
}

ahso danke

Aber wieso funktioniert das nicht:

    public static <T> void printArray(T[] o_c) {
        System.out.print("||>>");
        for (int i = 0; i != o_c.length;i++)
            System.out.print(o_c**+(i == o_c.length-1?"":", "));
        System.out.println("<<||");
    }```

```printArray(new int[3]);```
Und letzteres gibt mir dann eine Fehlermeldung:

The method printArray(T[]) in the type UTIL is not applicable for the arguments (int[])

DAs kommt daher, dass generics nur mit Klassen funktionieren und nicht auf primitive typen wie eben int einer ist.mit einem Integer Array solltest du keine Probleme haben.

[QUOTE=AmunRa]DAs kommt daher, dass generics nur mit Klassen funktionieren und nicht auf primitive typen wie eben int einer ist.mit einem Integer Array solltest du keine Probleme haben.[/QUOTE]Oder du verwendest wieder VarArgs…

  // do something
}```
Nun kann man auch einzelne primitive per Kommata getrennt übergeben, weil diese automatisch geboxed werden.
Besser (bzw klarer) wäre hier aber tatsächlich
```public static void printValues(Object values) {
  // do something
}```
oder
```public static void printValues(Object... values) {
  // do something
}```
wobei man bei ersterem auch primitive Arrays übergeben, innerhalb der Methode darauf testen und entsprechend behandeln kann. Bei letzterem lassen sich smtliche Arten von Arrays, Collections und Maps auch "clustern", z.B. für eine zentrale "hashCode()"-Methode (möglichst nicht nach machen ;)).
```	public static int hashCode(Object... values) {
		if (values == null || values.length == 0) {
			return 0;
		}
		int rc = 1;
		for (int n = 0; n < values.length; n++) {
			if (values[n] instanceof Object[][]) {
				rc = 31 * rc + hashCode(values[n]);
			} else if (values[n] instanceof Map) {
				rc = 31
						* rc
						+ hashCode(((Map<?, ?>) values[n]).entrySet().toArray());
			} else if (values[n] instanceof Object[]) {
				rc = 31 * rc + Arrays.hashCode(values);
			} else if (values[n] instanceof Map) {
				rc = 31
						* rc
						+ hashCode(((Map<?, ?>) values[n]).entrySet().toArray());
			} else if (values[n] instanceof Collection) {
				rc = 31 * rc + hashCode(((Collection<?>) values[n]).toArray());
			} else if (values[n] instanceof boolean[]) {
				rc = 31 * rc + Arrays.hashCode((boolean[]) values[n]);
			} else if (values[n] instanceof byte[]) {
				rc = 31 * rc + Arrays.hashCode((byte[]) values[n]);
			} else if (values[n] instanceof short[]) {
				rc = 31 * rc + Arrays.hashCode((short[]) values[n]);
			} else if (values[n] instanceof char[]) {
				rc = 31 * rc + Arrays.hashCode((char[]) values[n]);
			} else if (values[n] instanceof int[]) {
				rc = 31 * rc + Arrays.hashCode((int[]) values[n]);
			} else if (values[n] instanceof long[]) {
				rc = 31 * rc + Arrays.hashCode((long[]) values[n]);
			} else if (values[n] instanceof float[]) {
				rc = 31 * rc + Arrays.hashCode((float[]) values[n]);
			} else if (values[n] instanceof double[]) {
				rc = 31 * rc + Arrays.hashCode((double[]) values[n]);
			} else {
				rc = 31 * rc + values[n].hashCode();
			}
		}
		return rc;
	}```