2012-02-29 58 views
0

不安全投警告我很新的Java的泛型。但我读过很多摘要链接和示例。但我无法得到最简单的方法。我希望somenoe可以帮助:如何避免与Java的泛型

我想创建哪一个未定义的对象映射到另一个HashMap中。两个对象都可以是String或Integer中的一个。

所以我写了这一点:

private final HashMap<L, R> left2Right = new HashMap<L, R>(); 

Extractor<?> extLeft = Extractor.getInstance(0); 
Extractor<?> extRight = Extractor.getInstance(1); 

L leftVal = extLeft.extract(d, i); 
R rightVal = extRight.extract(d, i); 

this.left2Right.put(leftVal, rightVal); 

到目前为止好......但我有执行提取对象的问题。他们被工厂模式所影响。我做了这样的(simplyfied):

abstract class Extractor<E> { 
    abstract E extract(DTable source, int row); 

    static <E> Extractor<E> getInstance(int type) { 
     if(type == 0) 
      return new IntExtractor(); 
     else 
      return new StringExtractor(); 
    } 
} 

class IntExtractor extends Extractor<Integer> { 

    @Override 
    Integer extract(DTable source, int row) { 
     int value = 5; 
     return new Integer(value); 
    } 

} 

class StringExtractor extends Extractor<String> { 

    @Override 
    String extract(DTable source, int row) { 
     String retVal = "hello"; 
     return retVal; 
    } 

} 

它编译,但我得到的铸造整数/字符串E.我在做什么错取消保存投警告?我知道,我可以简单地抑制警告。但我认为这应该是Java泛型的优势?我不能让这个转换保存,因为我不知道,哪种类型的“E”真的“是” ......

还是我做的事情基本上是错了吗?

注: 我修改了代码,一个“新”的问题,我用从第一个答案的一些信息后...

+0

我确实有这样的感觉,你没有告诉我们这个问题的一切...... – Bombe 2012-02-29 08:49:45

回答

0

两个PE似乎不被用于提取输入为什么你甚至有他们吗?只需返回intString并完成它。

2

你的提取是不是真的通用的。这听起来像你想要的东西,如:

public interface Extractor<P> { 
    P extract(DTable source, int row); 
} 

但随后作出实现非通用:

class IntExtractor implements Extractor<Integer> { 

    Integer extract(DTable source, int row) { 
     int value = 5; 
     return new Integer(value); 
    } 
} 

从根本上说你当前的代码被打破,因为我可以写:

IntExtractor<String> extractor = new IntExtractor<String>(); 
String x = extractor.extract(...); 

...这显然会失败,但只有在执行时间。

+0

好吧......我没有发布一切。而不是一个接口我使用这样的抽象类: – Sauer 2012-02-29 09:16:27

+0

@Sauer:你应该编辑你的问题,而不是在评论中放置代码,但我怀疑同样的原则将适用。你的具体类不是通用的,即使它们继承了一个泛型类。 – 2012-02-29 09:18:05

1

我说你正在做的事情基本上是错误的。如果它是一个IntExtractor和一个StringExtractor,则不需要泛型。只要定义方法

Integer extract(DTable source, int row) 

String extract(DTable source, int row) 
1

问题是不是每本身你的代码。没有不安全的转换就无法解决任务本身。再次阅读自己一句:

我想创建哪一个未定义对象映射到 另一个HashMap中。两个对象都可以是String或Integer中的一个。

Java泛型无法为您解决这个问题,因为您必须事先知道类型,否则您必须进行施放。

说实话,我不知道你要实现你发布的代码是什么,但如果你想使用一个HashMap,你可以做这样的:

private final HashMap<String, Integer> left2Right = new HashMap<String, Integer>(); 
left2Right.put("one", 1); 
int numberOne = left2Right.get("one"); 

在这种情况下,你不必转换值,因为HashMap具有字符串键和整数值。如果你想把不同的类型作为值,你必须使用所有值的超类型。这个超类型可能是Object,它是层次结构的根。但在这些情况下,你必须投下 - 因为你不知道价值是什么样的对象。

private final HashMap<String, Integer> left2Right = new HashMap<String, Object>(); 
    left2Right.put("one", 1); 
    left2Right.put("two", new Date()); 
    // Because the compiler cannot know that type "one" might be, this isn't allowed and  you have to cast the value. It might be anything - in this example Date or Integer. 
    int numberOne = left2Right.get("one"); 

我希望有帮助。