Generics 是否有一种方法可以使用特定的子类型参数实现通用方法以避免强制转换?

Generics 是否有一种方法可以使用特定的子类型参数实现通用方法以避免强制转换?,generics,methods,casting,subclass,extends,Generics,Methods,Casting,Subclass,Extends,有没有一种方法可以使编译器强制在类中实现泛型方法,但为特定类型编码参数以避免强制转换。这可能违反了泛型的精神,但似乎是合理的 以下是尝试在泛型IRecordHelper.init()方法中使用特定子类型参数的想法: 公共类数据库RecordCommon{ 公共int id; } 公共类DatabaseRecordCar扩展DatabaseRecordCommon{ 公共字符串制作; 公共字符串模型; } 公共静态接口IRecordHelper{ 公共void init(T数据库记录); } 公共

有没有一种方法可以使编译器强制在类中实现泛型方法,但为特定类型编码参数以避免强制转换。这可能违反了泛型的精神,但似乎是合理的

以下是尝试在泛型IRecordHelper.init()方法中使用特定子类型参数的想法:

公共类数据库RecordCommon{
公共int id;
}
公共类DatabaseRecordCar扩展DatabaseRecordCommon{
公共字符串制作;
公共字符串模型;
}
公共静态接口IRecordHelper{
公共void init(T数据库记录);
}
公共类TestHelperCar实现了IRecordHelper{
//当使用特定子类声明car时,此init()将不允许编译该类。
公共void init(数据库RecordCar){
car.make=“mymake”;
car.model=“mymodel”;
}
//此init()允许类进行编译
//@覆盖
//公共void init(数据库记录公共数据库记录){
//DatabaseRecordCar=(DatabaseRecordCar)databaserecord;
//car.make=“mymake”;
//car.model=“mymodel”;
//    }
}
//示例用法。
公共静态无效进程(IRmsRecordCommon.IRRecordHelper[]arHelpers,DatabaseRecordCommon[]arRecords){
for(int i=0;i
除非第二个“init()”方法未注释,否则TestHelper类将不会编译

我试图实现的是强制TestHelper类具有init()方法,该方法接受DatabaseRecordCommon的子类,以便它可以访问特定的成员。我可以使用泛型init()方法并向下转换到DatabaseRecordCar(例如,注释的init()方法),但让编译器以某种方式要求TestHelper类具有init()方法,但允许指定扩展DatabaseRecordCommon的特定类型,而不是重新请求泛型类型,这似乎很有用。有办法吗

public class DatabaseRecordCommon {
    public int id;
}

public class DatabaseRecordCar extends DatabaseRecordCommon {
    public String make;
    public String model;
}

public static interface IRecordHelper<T extends DatabaseRecordCommon> {
    public void init(T databaserecord);
}

public class TestHelperCar implements IRecordHelper {
    // This init() will not allow the class to compile when car is declared with a specific subclass.
    public void init(DatabaseRecordCar car) {
        car.make = "mymake";
        car.model = "mymodel";
    }

    // This init() does allow the class to compile
//    @Override
//    public void init(DatabaseRecordCommon databaserecord) {
//        DatabaseRecordCar car = (DatabaseRecordCar) databaserecord;
//        car.make = "mymake";
//        car.model = "mymodel";
//    }
}

// Example usage.
public static void process(IRmsRecordCommon.IRecordHelper[] arHelpers, DatabaseRecordCommon[] arRecords) {
    for (int i = 0; i < arHelpers.length; i++)
        arHelpers[i].init(arRecords[i]);
}