code: func bindUnnestedTypeJava(stringKind string) (int, string) {
  
  	switch {
  	case strings.HasPrefix(stringKind, "address"):
  		parts := regexp.MustCompile(`address(\[[0-9]*\])?`).FindStringSubmatch(stringKind)
  		if len(parts) != 2 {
  			return len(stringKind), stringKind
  		}
  		if parts[1] == "" {
  			return len("address"), "Address"
  		}
  		return len(parts[0]), "Addresses"
  
  	case strings.HasPrefix(stringKind, "bytes"):
  		parts := regexp.MustCompile(`bytes([0-9]*)`).FindStringSubmatch(stringKind)
  		if len(parts) != 2 {
  			return len(stringKind), stringKind
  		}
  		return len(parts[0]), "byte[]"
  
  	case strings.HasPrefix(stringKind, "int") || strings.HasPrefix(stringKind, "uint"):
  		//Note that uint and int (without digits) are also matched,
  		// these are size 256, and will translate to BigInt (the default).
  		parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(stringKind)
  		if len(parts) != 3 {
  			return len(stringKind), stringKind
  		}
  
  		namedSize := map[string]string{
  			"8":  "byte",
  			"16": "short",
  			"32": "int",
  			"64": "long",
  		}[parts[2]]
  
  		//default to BigInt
  		if namedSize == "" {
  			namedSize = "BigInt"
  		}
  		return len(parts[0]), namedSize
  
  	case strings.HasPrefix(stringKind, "bool"):
  		return len("bool"), "boolean"
  
  	case strings.HasPrefix(stringKind, "string"):
  		return len("string"), "String"
  
  	default:
  		return len(stringKind), stringKind
  	}
  }
docs: // The inner function of bindTypeJava, this finds the inner type of stringKind.
  // (Or just the type itself if it is not an array or slice)
  // The length of the matched part is returned, with the translated type.