Java 方法在不同类型的参数上出现过载错误

Java 方法在不同类型的参数上出现过载错误,java,android,generics,overloading,Java,Android,Generics,Overloading,当我在android上工作的时候,我遇到了一个奇怪的问题(可能是因为我对java中的泛型缺乏了解),这个问题与方法重载有关。我在一个实用程序类中定义了以下静态方法,它给了我一个错误 public static void getAllFromDatabase(Context context, ArrayList<Student> students) { DatabaseHelper dh = new DatabaseHelper(context); students =

当我在android上工作的时候,我遇到了一个奇怪的问题(可能是因为我对java中的泛型缺乏了解),这个问题与方法重载有关。我在一个实用程序类中定义了以下静态方法,它给了我一个错误

public static void getAllFromDatabase(Context context, ArrayList<Student> students) {
    DatabaseHelper dh = new DatabaseHelper(context);
    students = dh.getStudents();
    dh.close();
}

public static void getAllFromDatabase(Context context, ArrayList<LogEntry> logs) {
    DatabaseHelper dh = new DatabaseHelper(context);
    logs = dh.getlog();
    dh.close();
}
publicstaticvoid getAllFromDatabase(上下文,arrayliststudents){
DatabaseHelper dh=新的DatabaseHelper(上下文);
students=dh.getStudents();
dh.close();
}
公共静态void getAllFromDatabase(上下文、ArrayList日志){
DatabaseHelper dh=新的DatabaseHelper(上下文);
logs=dh.getlog();
dh.close();
}
有什么帮助吗?提前谢谢。

公共类CustomCallBack实现回调{
public void getAllFromDatabase(上下文、ArrayList日志){
}
}

由于类型擦除过程,您可以在

上引用它,您会遇到此问题,因为这两种方法在之后都是相同的

在类型擦除过程中,Java编译器将擦除所有类型 如果类型为 参数是有界的,如果类型参数是无界的,则为对象

参见

这是因为 当Java实现泛型时,为了使字节码向后兼容,Java会删除类型以使签名成为泛型,在运行时泛型信息消失,签名将显示为:

public static void getAllFromDatabase(Context context, ArrayList students);
public static void getAllFromDatabase(Context context, ArrayList logs); 
因此,您有两个具有相同类型参数的方法,因此您将得到一个错误。 用更多的方法尝试;

这大概是因为擦除;如果Java从一开始就有泛型,这可能不会发生。您可能会将这两个参数视为不同的类型,但当删除时,JVM将看到两个将Map作为其参数类型的方法


但是,您可以通过给这些方法一个不同的返回类型来作弊。虽然擦除后,它们都有相同的名称和参数,但字节码会有所不同,因为整个签名不相同-返回类型不同

,您会因此而出错。类型擦除在编译时删除所有泛型信息

方法解析发生在编译时,不考虑类型参数。


Java泛型使用类型擦除。尖括号
中的位将被删除,因此您将得到两个具有相同签名的方法。这是不允许的,因为运行时不知道对每种情况使用哪种方法。

什么错误?你的泛型被删除了,这意味着,有关泛型类型的信息仅在编译期间存在-在运行期间,两个方法具有相同的擦除类型,这实际上不是重载,而是针对同一签名的编译错误。这些方法无论如何都不会工作-您无法通过指定参数返回值,这只是因为它们都是
静态
方法@ThomasKläger
students=dh.getStudents()更新参数
学生
。此赋值在方法结束后丢失。你应该
返回学生。不,这不是静态方法特有的。看到有很多回调,我想知道应该实现哪一个?这只是一个例子,放在你的类上我的两个方法是静态的。更改返回类型会删除错误,但我想知道如果我调用像
CommonUtilities.getAllFromDatabase(context,logList)
这样的调用,会调用其中哪一个。
public static void getAllFromDatabase(Context context, ArrayList students);
public static void getAllFromDatabase(Context context, ArrayList logs);