java - Java:泛型:从泛型方法获取对象类型 T 并访问其方法
问题描述
public interface MyMapperInterface<Y, Z> {
Y map(Z zObject);
}
public class One{
}
public class Two{
}
public MapperOneTwo implements MyMapperInterface<One, Two> {
public One map(Two twoObject){
//Based on properties of Two, a new One Object is created and returned.
}
}
public MapperThreeFour implements MyMapperInterface<Three, Four> {
public One map(Two twoObject){
//Now for two other class, Three and Four, there is a new
mapper.
Based on properties of Two, a new One Object is created and
returned.
}
}
FactoryClass
public class Factory {
public <T> T getClassInstance(String params){
if (params.equals("a")) {
return (T) new MapperOneTwo();
} else if (params.equals("b")){
return (T) new MapperThreeFour();
}
}
}
用法 我有一个处理程序类,它需要映射和传递另一种类型。所以我希望将类型传递给工厂,然后工厂提供相应的映射器,然后该映射器完成其工作并返回相应类型的对象。但问题是现在返回的对象是 Object 类型的,这个处理程序类必须在进一步传递它之前对其进行类型转换。
有没有办法避免类型转换并且仍然能够创建这样的工厂?
谢谢
解决方案
因为编译器认为它是 Object 类类型
在运行时,T
is just Object
,所以它与编译器无关。实际上,泛型主要是编译时的现象,所以编译器实际上知道泛型类型,但是由于类型擦除,这在运行时消失了。
标准工厂模式对接口使用编码,即它返回一个接口实例,其后面可能是特定的实现类型。所以这样的事情应该适合你:
public class Factory {
public static MyInterface getClassInstance(String param) {
switch (param) {
case "a":
return new MyClassA();
break;
case "b":
return new MyClassB();
break;
default:
return null;
}
}
}
然后,在您的代码中,您可以只使用 的实例MyInstance
而不必担心实现。如果您的代码未设置为以这种方式使用该模式,您可能需要进行重构以便可以。
推荐阅读
- javascript - 如何在所有服务器之间共享身份验证信息?
- python-3.x - python简单帮助(NameError:名称未定义)
- ios - SwiftUI List - 禁用特定行的移动?
- docusignapi - docusign api 选项卡标签通配符匹配文档在哪里
- python-3.x - Python 避免使用非阻塞写入命名管道的部分写入
- javascript - window.open 找不到 html 文件
- micronaut-data - 如何使用插入 sql 语句覆盖 jdbc 存储库中的保存方法
- cookies - 如何更改 Jersey 客户端中的 CookieSpec?
- java - 如何使用 gradle maven-publish 插件和 Kotlin DSL 发布带有空 pom 的影子 jar?
- assembly - 在 bochs 中调试 MS-DOS 源代码。循环问题