Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Type Erasure - Fatal编程技术网

方法不适用于Java中有关泛型或类型擦除的参数

方法不适用于Java中有关泛型或类型擦除的参数,java,generics,type-erasure,Java,Generics,Type Erasure,我遇到了一个关于Java泛型的问题 我正在尝试创建一个侦听器(称为SomeEventListener),它侦听要发生的SomeEvent。这些事件具有特定类型的结果;我希望通过方法getResult()检索该结果,其返回类型为T。当触发该事件时,将调用eventoccurrent(SomeEvent)方法 SomeEvent类: public class SomeEvent<T> { private T result; public SomeEvent(T res

我遇到了一个关于Java泛型的问题

我正在尝试创建一个侦听器(称为
SomeEventListener
),它侦听要发生的
SomeEvent
。这些事件具有特定类型的结果;我希望通过方法
getResult()
检索该结果,其返回类型为
T
。当触发该事件时,将调用
eventoccurrent(SomeEvent)
方法

SomeEvent类:

public class SomeEvent<T> {

    private T result;

    public SomeEvent(T result) {
        this.result = result;
    }

    public T getResult() {
        return this.result;
    }
}
public interface SomeEventListener<T> {

    void eventOccurred(SomeEvent<T> event);

}
公共类SomeEvent{
私人T结果;
公共事件(T结果){
this.result=结果;
}
公共T getResult(){
返回此结果;
}
}
SomeEventListener类:

public class SomeEvent<T> {

    private T result;

    public SomeEvent(T result) {
        this.result = result;
    }

    public T getResult() {
        return this.result;
    }
}
public interface SomeEventListener<T> {

    void eventOccurred(SomeEvent<T> event);

}
公共接口SomeEventListener{
发生无效事件(SomeEvent事件);
}
另一类

public class AnotherClass {

    ArrayList<SomeEventListener<?>> listeners = new ArrayList<SomeEventListener<?>>();

    <T> void fireSomethingOccursEvent(SomeEvent<T> event) {
        for (SomeEventListener<?> listener : this.listeners) {
            listener.eventOccurred(event); // MARKED LINE
        }
    }
}
公共类另一类{
ArrayList>();
void fireSomethingOccursEvent(SomeEvent事件){
for(SomeEventListener侦听器:this.listeners){
listener.eventOccessed(event);//标记行
}
}
}
但是,Eclipse在标记行上给出了一个错误:

SomeEventListener类型中的方法EventOccurrent(SomeEvent)不适用于参数(SomeEvent)

我怀疑为什么会发生这种情况——它可能与泛型和类型擦除有关——但我无法解决它

我的问题是:

  • 为什么上述代码无效
  • 如何修复代码

注意:关于泛型和/或类型擦除的帖子很多;然而,我找不到这个问题的答案。如果您认为另一个答案合适,请链接到它。

您有一个
SomeEventListener
,方法是
void eventoccurrent(SomeEvent event)
(将
替换为
T

对于一些完全不相关的
T
,您还有一个
SomeEvent

您无法将其转换为
SomeEvent
——事实上,除了
null
之外,您无法将任何内容转换为
SomeEvent
<代码>?表示“我不知道此类型参数是什么。”

例如,如果允许您的代码,则此代码将编译,但传递错误的类型:

AnotherClass ac = new AnotherClass();

ac.listeners.add(new SomeEventListener<Integer>() {
    void eventOccurred(SomeEvent<Integer> event) {
        System.out.println(event.intValue());
    }
});

SomeEvent<String> event = new SomeEvent<String>("Hello");
ac.fireSomethingOccursEvent(event);
AnotherClass ac=新的AnotherClass();
添加(新的SomeEventListener()){
发生无效事件(SomeEvent事件){
System.out.println(event.intValue());
}
});
SomeEvent=新的SomeEvent(“你好”);
ac.火灾事件(事件);

现在,
FireSomeThingOccurEvent
将获取
SomeEvent
并将其传递给
SomeEventListener
。这显然是不允许的-因此,这是不允许的。

您可以将整个
设置为另一个类
通用,并使用:

公共类另一类{

ArrayLisf如果您搜索类型安全的通用异构容器,您可能会得到一些与您的问题相关的信息。没有太多时间调查该问题,抱歉:(有点晚了,但我已经接受了您的答案。:-)