我有以下课程:
public class DataService {
static <T> void load(Structure structure, String path, DataServiceType dataService) {
//do smth
}
private interface DataServiceType<T> {
//do smth
}
private static class DataServiceInteger implements DataServiceType<Integer> {
//do smth
}
private static class DataServiceString implements DataServiceType<String> {
//do smth
}
}
我想添加以下两种方法:
public static void load(Structure<Integer> structure,String path) throws IOException {
load(structure,path,new DataServiceInteger());
}
public static void load(Structure<String> structure,String path) throws IOException {
load(structure,path,new DataServiceString());
}
但两种方法都有相同的擦除。如何在不更改方法名称的情况下实现它?
修改
我不准确。类实现DataServiceType有mathod:
void getDataFromString(String in, T out);
(他们是paresers)
从文件中读取来自DataService的mehod static <T> void load(Structure structure, String path, DataServiceType dataService)
,因此M. le Rutte的解决方案对我不利,因为我必须重复自己。是否有可能为我的问题实施浆果的解决方案?
答案 0 :(得分:2)
正如您已经发现的,由于类型擦除,运行时将无法区分不同的方法。名称必须不同,或者参数必须不同。
但是,您使用static
方法。我个人的选择是使用DataService
的具体实例:
public interface DataService<T> {
Structure<T> load(Path path);
}
public StringDataService implements DataService<String> {
public Structure<String> load(Path path) {
...
}
}
public IntDataService implements DataService<Integer> {
public Structure<Integer> load(Path path) {
...
}
}
答案 1 :(得分:0)
你做不到。类型擦除在Java中的工作方式是“隐藏&#39; (synthetic
)方法由编译器在编译期间创建,该方法将对象从某个超类(通常为Object
)转换为正确的类型。由于您的示例中有两种不同的类型,因此Java编译器不知道要转换哪个类型,因为名称和其他参数完全匹配。
最好以不同方式命名方法,因为加载String
并加载integer
可能不一定以完全相同的方式处理。例如,您可能需要在内存中加载用户输入字符串列表:在这种情况下,可能需要先对字符串进行清理。
答案 2 :(得分:0)
如上所述,你不能完全按照描述去做。但是,您可以通过向load()
方法本身添加通用参数,然后创建通用DataServiceClazz
类型(与分隔DataServiceInteger
,DataServiceString
类相对)来实现实现您的DataServiceType
界面:
private static class DataServiceClazz<T> implements DataServiceType<T> { //Replaces DataServiceInteger, DataServiceString, etc.
//do smth
}
public static <T> void load(Structure<T> structure, String path) throws IOException {
load(structure, path, new DataServiceClazz<>());
}
根据您的使用情况,这可能不起作用,因为您将无法根据T的类型使用不同的逻辑 - 但它是与您当前最接近的模式。