JBo*_*Boy 1 java generics iterator hashset downcast
我正在试图看看HashSet是否是我下一个项目的解决方案,所以我正在做一些非常简单的测试来检查功能.我有一个简单的课程Klant:
public class Klant {
private int klantNummer;
public Klant(int nummer) {
this.klantNummer = nummer;
}
public int getKlantNummer() {
return this.klantNummer;
}
}
Run Code Online (Sandbox Code Playgroud)
并且通过组合的类使用a HashSet
public class MySet<Klant> {
private Collection<Klant> mySet = null;
public MySet() {
mySet=new HashSet<Klant>();
}
public void add(Klant elem) {
mySet.add(elem);
}
public void toon() {
Iterator<Klant> i = mySet.iterator();
while(i.hasNext()) {
Klant k = i.next();
System.out.println(k.);
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在方法toon()
基本上即使我指定的迭代器将包含Klant对象<Klant>
的本地k对象不向我提供的getKlantNummer()定义mthod Klant
的k对象还是它的Object,甚至用它铸造例如:
Object k = (Klant)i.next();
Run Code Online (Sandbox Code Playgroud)
它不会起作用.堕落是危险的,但据我记得,这是不被禁止的.
有什么建议?
在你的课程定义中,你有
public class MySet<Klant> {
Run Code Online (Sandbox Code Playgroud)
这Klant被解释为你的类的类型参数(就像E是Collection或K和V是Map).Klant当你随后在其中使用它时,它会覆盖你的实际类MySet,并且由于它的擦除Object(如你指定的没有上限),Klant你的MySet类中的类型变量只会看到Object方法.删除类型参数并使用
public class MySet {
Run Code Online (Sandbox Code Playgroud)
你应该好.