2012-12-11 361 views
2

在抽象工厂模式中,我使用的是泛型。 我有扩展Serializable的BaseEntity接口,Employee类实现BaseEntity。 在抽象类我有这个getJavaObj方法泛型类型铸造?

getJavaObj()是取Long empId的方法,并返回一个Map<String, ? extends BaseEntity>

public abstract Map<String, ? extends BaseEntity> getJavaObj(Long id); 

使用泛型我试图做到这一点在它给人的主类;

Map<String, Employee> emp = getJavaObj(empId); 

它给这个错误类型安全:从Map<String,capture#1-of ? extends BaseEntity>未经检查的强制转换为地图

当我做类型转换这样

Map<String, Employee> emp = (Map<String, Employee>)getJavaObj(empId); 

它给出了这样的警告

类型安全:未选中投自Map<String,capture#1-of ? extends Serializable>至 地图 类型安全:未选中从Map<String,capture#1-of ? extends BaseEntity>转换为 地图

有没有办法避免类型转换或解决警告甚至类型转换后?由于我要返回的对象通过BaseEntity接口扩展到Serializable。

回答

2

重新定义你的工厂方法:

public abstract <T extends BaseEntity> Map<String, T> getJavaObj(Long id); 

然后你就可以得到正确的类型背不进行强制转换:

Map<String, Employee> emp = getJavaObj(empId); 
+0

不能他们只是一个泛型类型ARG添加到方法,而不是类参数?正如'public abstract Map getJavaObj(Long id)'?或者我忘了一些关于泛型方法参数的重要内容? –

+0

@TomG - 这也可以。我认为T已经是一个类参数。发布作为答案,它可能会得到一个绿色的复选标记。 :) –

+0

@TedHopp在抽象类中,它不允许按照你的建议。它提供了错误,并建议:多标记在该行 \t - 类型参数字符串是隐藏式 \t字符串 \t - 这种方法需要一个机构,而不是一个 \t分号 \t - 返回类型的方法缺少 \t - 令牌上的语法错误“扩展”,预期为 –