/*
 * package g5.m.def is the package to define (def) generic (g5) methods (m)
 * 
 * We have 5 typical methods:
 * 	- standard: not generic, parameters is generic type parameter
 * 	- generic: multiple method type parameters
 * 	- return generic type with multiple type arguments
 * 	- method parameter which is several parameterized types
 * 	- mix of all previous ones
 */
package g5.m.def;
public class Multiple<T1, T2, T3> {
	public void standard(T1 t1, T2 t2, T3 t3) {
	}
	public <U1, U2, U3> T1 generic(U1 u1, U2 u2, U3 u3) {
		return null;
	}
	public Multiple<T1, T2, T3> returnParamType() {
		return new Multiple<T1, T2, T3>();
	}
	public void paramTypesArgs(Single<T1> st1, Single<T2> st2, Single<T3> st3, Multiple<T1, T2, T3> gmt) {}
	public <U1, U2 extends Exception, U3 extends RuntimeException> Multiple<T1, T2, T3> complete(U1 u1, U2 u2, U3 u3, Multiple<T1, T2, T3> g) {
		if (u1 == null || u2==null || u3==null) {
			if (g == null) {
				return null;
			}
			return g;
		} else {
			return new Multiple<T1, T2, T3>().returnParamType();
		}
	}
}
