В типизированных Java-методах для определения выходных данных используются входные данные, поэтому вы можете объявить метод
public List<T> asList(T[] myArray) {
...
}
При вызове этого метода вы просто передаете свой класс, и компилятор знает, какой тип возврата.
String[] myArray = {"asdf", "asdf"};
List<String> result = asList(myArray);
В качестве альтернативы, вы можете иметь типизированный класс, который использует этот параметр типа для определения результата
public class Foo<T> {
public void myMethod(T myObject) {
..do something
}
}
Если вы создаете Foo, как
Foo<String> foo = new Foo<String>();
Вы можете вызывать myMethod только со строкой
foo.myMethod("asdf"); //okay
foo.myMethod(new BigInteger(1)); //not okay
Есть еще много вещей, которые вы можете делать с типизированными объектами, но, надеюсь, это дойдет до того, о чем вы спрашивали.