Iterating over member typed collection fails when using untyped reference to generic object

Posted by Alexander Pavlov on Stack Overflow See other posts from Stack Overflow or by Alexander Pavlov
Published on 2012-10-02T15:35:38Z Indexed on 2012/10/02 15:37 UTC
Read the original article Hit count: 205

Filed under:
|

Could someone clarify why iterate1() is not accepted by compiler (Java 1.6)? I do not see why iterate2() and iterate3() are much better.

This paragraph is added to avoid silly "Your post does not have much context to explain the code sections; please explain your scenario more clearly." protection.

import java.util.Collection;
import java.util.HashSet;

public class Test<T> {

    public Collection<String> getCollection() {
        return new HashSet<String>();
    }

    public void iterate1(Test test) {
        for (String s : test.getCollection()) {
            // ...
        }
    }

    public void iterate2(Test test) {
        Collection<String> c = test.getCollection();
        for (String s : c) {
            // ...
        }
    }

    public void iterate3(Test<?> test) {
        for (String s : test.getCollection()) {
            // ...
        }
    }


}

Compiler output:

$ javac Test.java
Test.java:11: incompatible types
found   : java.lang.Object
required: java.lang.String
  for (String s : test.getCollection()) {
                                              ^
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

© Stack Overflow or respective owner

Related posts about java

Related posts about generics