Roedy Green wrote:
On Thu, 20 Aug 2009 17:22:26 +0200, Ivan Voras <ivoras@fer.hr> wrote,
quoted or indirectly quoted someone who said :
The problem is that the following (simplified) code works:
for (Object orow : new MyIter()) {
Hashtable<String, Object> row = (Hashtable<String, Object>) orow;
System.out.println(row);
}
I suspect this example is too far away from your real code. Try
composing an SSCCE. see http://mindprod.com/jgloss/sscce.html
Ok, here is self contained example, directly compilable:
----
import java.util.Hashtable;
import java.util.Iterator;
public class MyIter implements Iterator<Hashtable<String,Object>>,
Iterable {
public Iterator iterator() {
i = 0;
return this;
}
public boolean hasNext() {
return i < 3;
}
public void remove() {
throw new UnsupportedOperationException();
}
public Hashtable<String,Object> next() {
i++;
Hashtable<String,Object> h = new Hashtable<String,Object>();
h.put(""+i, new Integer(i));
return h;
}
}
----
The expected result of running this example are three lines on stdout:
----
{1=1}
{2=2}
{3=3}
----
It should go twice if the first, commented out attempt at foreach worked.
To be specific, my question is: why won't the following line compile:
for (Hashtable<String,Object> h : new MyIter())
but this one will:
for (Object oh : new MyIter())
?
The error compiler complains about is:
MyIter.java:13: incompatible types
found : java.lang.Object
required: java.util.Hashtable<java.lang.String,java.lang.Object>
for (Hashtable<String,Object> h : new MyIter())
Of course, with the code that *does* work, the cast from Object to
Hashtable<String,Object> gives an "unchecked operation" warning:
MyIter.java:19: warning: [unchecked] unchecked cast
found : java.lang.Object
required: java.util.Hashtable<java.lang.String,java.lang.Object>
Hashtable<String,Object> h = (Hashtable<String, Object>) oh;
new MyIter does not look plausible. The way you get an Iterator is
nearly always SomeCollection.iterator()
Note that I'm not implementing or overloading a collection. I'm
iterating over something abstract and the result of each iteration of my
iterator is a collection (which is a detail that should be inconsequential).
System.out.println( row ) won't print anything interesting. You need
an inner loop to iterate over the objects in the row.
The println() only serves as an example. It will print out a Hashtable's
contents cast to string.