According the JLS, you cannot however due to a feature/bug in the Java 6/7 compiler (Oracle's JDK, OpenJDK, IBM's JDK) you can have different return types for the same method signature if you use generics.
public class Main {
public static void main(String... args) {
Main.<Integer>print();
Main.<Short>print();
Main.<Byte>print();
Main.<Void>print();
}
public static <T extends Integer> int print() {
System.out.println("here - Integer");
return 0;
}
public static <T extends Short> short print() {
System.out.println("here - Short");
return 0;
}
public static <T extends Byte> byte print() {
System.out.println("here - Byte");
return 0;
}
public static <T extends Void> void print() {
System.out.println("here - Void");
}
}
Prints
here - Integer
here - Short
here - Byte
here - Void
For more details, read my article here