如何使用Java Generics避免未经检查的强制转换警告

不知怎的,我的旧问题已经关闭,所以我开了一个新问题:

我正在使用Java Generics从SQL查询中实现通用双向哈希映射。 它应该能够来回映射String,Integer对的任意组合。 它应该像这样使用:

String sql = "SELECT string_val, int_val FROM map_table"; PickMap pm1 = new PickMap(sql); String key1 = "seven"; Integer value1 = pm1.getLeft2Right(key1); Integer key2 = 7; String value2 = pm1.getRightToLeft(key2); 

当然应该可以创建一个pm(整数,整数)等等……

我对Pick Map的实现看起来像这样(没有getter …):

 public class PickMap { private final HashMap left2Right = new HashMap(); private final HashMap right2Left = new HashMap(); public PickMap(String sql) throws OException { DTable d = new DTable(sql); int colTypeL = dtgetColType(1); int colTypeR = dtgetColType(2); Extractor extLeft = (Extractor) getInstance(colTypeL); Extractor extRight = (Extractor) getInstance(colTypeR); int numRows = dtgetNumRows(); for(int i=1;i<=numRows;i++) { L leftVal = extLeft.extract(d, i); R rightVal = extRight.extract(d, i); this.left2Right.put(leftVal, rightVal); this.right2Left.put(rightVal, leftVal); } } private Extractor getInstance(int type) { if(type == 1) return new IntExtractor(); else return new StringExtractor(); } } interface Extractor { E extract(DTable source, int row); } class IntExtractor implements Extractor { @Override public Integer extract(DTable source, int row) { int value = 5; return new Integer(value); } } class StringExtractor implements Extractor { @Override public String extract(DTable source, int row) { String retVal = "hello"; return retVal; } } 

我没有编译器错误,我很确定,它会以这种方式工作。 但是我在“getInstance”方法上得到了未经检查的强制转换警告,其中我将Extractor(E)转换为Extractor(L)……

我该如何正确演员? 或者我错过了什么? 或者我应该只是压制这些警告?

你收到了警告,因为你所做的事情不能被certificate是安全的。 您假设 getInstance(colTypeL)将返回Extractor – 但无法在编译时或执行时validation。

您可以使用其他人提到的@SuppressWarnings("unchecked") ,但我会尝试重新考虑一下这个设计。

您可以使用以下注释使编译器不输出这些警告:

 @SuppressWarnings("unchecked") 

请参阅此相关问题 ,该问题涉及同一问题。 答案将解释您需要知道的一切。