Generics class breaks completely separate method

I discovered a strange problem when I used the Generics Today class: setting some broke an entirely separate method.

Here is a small sample class that illustrates the problem. This code works just fine

public class Sandbox {
    public interface ListenerManagerTest {
        public Set<Listener> getListeners();
    }

    public void setListenerManager(ListenerManagerTest listenerManager) {
        for (Listener curListener : listenerManager.getListeners())
            return;
    }
}

Now when I use the Generics class, the method getListeners()returns Set<Object>insteadSet<Listener>

public class Sandbox {
    public interface ListenerManagerTest<E extends Object> {
        public Set<Listener> getListeners();
    }

    public void setListenerManager(ListenerManagerTest listenerManager) {
        for (Listener curListener : listenerManager.getListeners()) //Expected Listener, not Object
            return;
    }
}

What can cause this error? The channel ##javaon Freenode said it was due to compilation, and I used the raw type. But how would the class type raw break all generics in the class? And how would you work earlier?

+3
source share
2 answers

raw- (.. ListenerManagerTest ListenerManagerTest<...>) generics , public Set<Listener> getListeners() public Set getListeners(), .

( ):

public void setListenerManager(ListenerManagerTest<?> listenerManager) { ... }

. , . , , . , .

, ListManagerTest :

public void addListenersToTest(ListenerManagerTest listenerManager, Set listeners) {
    listenerManager.getListeners().addAll(listeners);
}

, , . , .

+6

JLS3 4.8

... - ...

... ... C... ...

, .

? , - . , . , , , - , .

0

All Articles