Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类泛型打破了完全独立的方法_Java_Generics - Fatal编程技术网

Java 类泛型打破了完全独立的方法

Java 类泛型打破了完全独立的方法,java,generics,Java,Generics,当我今天使用类泛型时,我发现了一个奇怪的问题:设置一些泛型会破坏一个完全独立的方法 这里有一个小示例类说明了这个问题。这段代码运行得很好 public class Sandbox { public interface ListenerManagerTest { public Set<Listener> getListeners(); } public void setListenerManager(ListenerManagerTest li

当我今天使用类泛型时,我发现了一个奇怪的问题:设置一些泛型会破坏一个完全独立的方法

这里有一个小示例类说明了这个问题。这段代码运行得很好

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

    public void setListenerManager(ListenerManagerTest listenerManager) {
        for (Listener curListener : listenerManager.getListeners())
            return;
    }
}
什么会导致这个错误?Freenode上的
##java
频道说这是因为编译时的candy,我使用的是原始类型。但是原始类类型如何打破类中的所有泛型呢?of以前是如何工作的?

使用原始类型(即
ListenerManagerTest
而不是
ListenerManagerTest
)禁用其所有成员的泛型,因此
公共集getListeners()
被视为
公共集getListeners()
,因此,如果没有额外强制转换,就无法迭代它

使用参数化类型而不是原始类型(如果需要,使用通配符):

一般来说,引入raw类型的概念是为了向后兼容,不建议在没有需要的情况下使用raw类型。这就是为什么原始类型具有这些奇怪的兼容性相关特性。

JLS3 4.8原始类型

超类。。。一个原始类型是超类的擦除

类型的。。。实例方法。。。原始类型的C。。。是删除它的类型

正如你的例子所示,这是不必要的苛刻


为什么??我猜在某一点上,他们只是举手投降。泛型太他妈复杂了,很难让一切都正确。原始类型可能是他们可以休息和马虎的地方——借口是我们无论如何都把原始类型视为杂种。

为什么它会这样做?E和Listener是两个完全不同的泛型类型,但E是其他类型的。哦,在我发布问题之前,我发现了
。我更多的是问为什么,而不是怎么,我不觉得向后兼容性的解释很有说服力。如果将结果分配给原始类型,则仍然可以轻松地链接具有泛型返回类型的方法。
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;
    }
}
public void setListenerManager(ListenerManagerTest<?> listenerManager) { ... }
public void addListenersToTest(ListenerManagerTest listenerManager, Set listeners) {
    listenerManager.getListeners().addAll(listeners);
}