方法不适用于Java中有关泛型或类型擦除的参数
我遇到了一个关于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
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如果您搜索类型安全的通用异构容器,您可能会得到一些与您的问题相关的信息。没有太多时间调查该问题,抱歉:(有点晚了,但我已经接受了您的答案。:-)