String is just the datatype, as is int. You don't need to specify the size of it until you instantiate it. When an array is returned by something different, it can take the place of the placeholder.
Simple look: T -> 4 byte pointer <- T returned
The T you declared is simply a pointer to the returned results of the T. The pointer has been assigned, but in Java world I don't know if its a direct memory pointer or if it has multiple levels of indirection. I'd assume multiple levels.
Your thread is different. String.split will return a String, so you cannot just cast that into an int type. Without a defined size of the T, it is assumed to be that of 0, so you cannot dereference it to write any data into it.
So with your example you could have actually used:
String octets = args.getHostAddress().split("\\.");
The only way to cast it is by iterating it after the fact, which means you'll need to either do something immediately, store it in a collection, or use a pre-defined array size.
Sorry, for a better explanation of the problem in your other thread:
int i = null; is an int array without a size. Your error came from trying to use i[value], since this would never exist. This is why you needed to use a new int for the size.