int Submit(); char Submit();但是如果程序这么写 Submit();而不是int a = Submit();或者char a = Submit(); 那编译器该调用哪个呢?
比如,你重载了f() int f(){} List f(){} 当你调用f()时,你是调用的哪个呢? 用返回值来区分重载会造成程序可读性差和不可预知的错误 所以返回值不能用来区别重载
java里允许调用一个有返回值的方法的时候不必将返回值赋给变量; 这样JVM就不知道你调用的是有返回值的还是没返回值的. 如 class Test{ public static void testMethod(){ } public static int testMethod(){ }//姑且假设允许吧 public static void main(String[] args){ int i = testMethod();//这个还说的过去 知道是调用哪个 testMethod();//这个就无法判断调用哪个方法了 } }
举个最简单的例子吧 class A { public static void main(String[] args) { System.out.println(new A().b()); } public int b() { return 1+2; } public double b() { return 1.2 + 2.4; } }编译出错 13行(public double b()) 已在A中定义了b()
import java.util.ArrayList; import java.util.List;public class TestGenerics { //方法1 public void test(List<String> list) { System.out.println("List<String>"); // return null; }
//方法2 public ArrayList test(List<Object> list) { System.out.println("List<Object>"); return null; } //方法3 // public void test(List<Object> list) // { // System.out.println("List<Object>"); // } //方法4 // public ArrayList test(List<String> list) // { // System.out.println("List<Object>"); // return null; // } public static void main(String[] args) { TestGenerics date = new TestGenerics();
char Submit();但是如果程序这么写
Submit();而不是int a = Submit();或者char a = Submit();
那编译器该调用哪个呢?
int f(){}
List f(){}
当你调用f()时,你是调用的哪个呢?
用返回值来区分重载会造成程序可读性差和不可预知的错误
所以返回值不能用来区别重载
这样JVM就不知道你调用的是有返回值的还是没返回值的.
如
class Test{
public static void testMethod(){ }
public static int testMethod(){ }//姑且假设允许吧
public static void main(String[] args){
int i = testMethod();//这个还说的过去 知道是调用哪个
testMethod();//这个就无法判断调用哪个方法了
}
}
class A
{
public static void main(String[] args)
{
System.out.println(new A().b());
} public int b()
{
return 1+2;
} public double b()
{
return 1.2 + 2.4;
}
}编译出错 13行(public double b()) 已在A中定义了b()
import java.util.List;public class TestGenerics
{
//方法1
public void test(List<String> list)
{
System.out.println("List<String>");
// return null;
}
//方法2
public ArrayList test(List<Object> list)
{
System.out.println("List<Object>");
return null;
} //方法3
// public void test(List<Object> list)
// {
// System.out.println("List<Object>");
// } //方法4
// public ArrayList test(List<String> list)
// {
// System.out.println("List<Object>");
// return null;
// }
public static void main(String[] args)
{
TestGenerics date = new TestGenerics();
date.test(new ArrayList<Object>());
date.test(new ArrayList<String>());
}
}
首先 上面的代码肯定是对的
方法1 和 方法2 确实可以共存 为什么??????? 如果说方法1 和 方法2 的重载是因为List<String>不同于List<Object>
那为什么 方法1 和 方法3 不能重载? 如果说方法1 和 方法2 的重载不是因为参数表 那是通过什么来区别? 返回类型吗?
那为什么 方法1 和 方法4 不能重载? 难道 对涉及 泛型的 方法重载的规范变了???