Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Oop_Generics - Fatal编程技术网

Java:如何设计这个类,使其具有可选的泛型参数类型?

Java:如何设计这个类,使其具有可选的泛型参数类型?,java,oop,generics,Java,Oop,Generics,我的代码中有这个类 public abstract class MyAbstractEventListener<E extends IMyEvent> { public abstract void handleEvent(E e); } 没有关于类为原始类的警告,并重新编译以对其进行参数化 为了澄清这一点,我希望类允许A或B实例化,每次都可以选择使用我喜欢的实例化。如果有一些泛型参数,则表示接收IMyEvent对象的方法,如果没有,则表示没有参数的方法 使用此类的代码示例如

我的代码中有这个类

public abstract class MyAbstractEventListener<E extends IMyEvent> {
    public abstract void handleEvent(E e);
}
没有关于类为原始类的警告,并重新编译以对其进行参数化

为了澄清这一点,我希望类允许A或B实例化,每次都可以选择使用我喜欢的实例化。如果有一些泛型参数,则表示接收IMyEvent对象的方法,如果没有,则表示没有参数的方法

使用此类的代码示例如下:

EventBus.getInstance().addEventListener("some.string", new 
    AbstractEventListener<IMyEvent>() {
        @Override
        public void handleEvent(final IMyEvent e) {
            // Sometimes does use 'e', sometimes doesn't. That's the point
            MyConfirmationWindow.showConfirmationWindow(MyWindowType.WARNING, "kk", "lll");
        }
    });
EventBus.getInstance().addEventListener(“some.string”,新增)
AbstractEventListener(){
@凌驾
公共无效处理事件(最终事件e){
//有时使用“e”,有时不使用。这就是重点
MyConfirmationWindow.showConfirmationWindow(MyWindowType.WARNING,“kk”,“lll”);
}
});

有办法吗?任何链接或资源都将受到欢迎。

您可以创建一个抽象子类:

public abstract class BlindListener extends MyAbstractEventListener<IMyEvent> {

    public abstract void handleEvent();

    @Override
    public void handleEvent(IMyEvent iMyEvent) {
        handleEvent(); // delegate to abstract method that ignores the argument
    }
}

确实需要特定类型的实例仍然可以直接使用
MyAbstractEventListener

那么,您可以创建一个抽象子类:

public abstract class BlindListener extends MyAbstractEventListener<IMyEvent> {

    public abstract void handleEvent();

    @Override
    public void handleEvent(IMyEvent iMyEvent) {
        handleEvent(); // delegate to abstract method that ignores the argument
    }
}
确实需要特定类型的实例仍然可以直接使用
MyAbstractEventListener

公共抽象类MyAbstractEventListener{
但出于我的目的,如果没有必要的事件信息(我们称之为B),也能做到这一点将是理想的:

问题是:类
MyAbstractEventListener
如何处理参数类型
E
扩展的信息
IMyEvent
?该类中是否有任何方法处理类型
IMyEvent

如果没有,您可以简单地删除
扩展IMyEvent
,以实现您的目标

否则,您需要另一个类,因为
MyAbstractEventListener
依赖于类型
E
扩展(或实现)
IMyEvent

公共抽象类MyAbstractEventListener{
但出于我的目的,如果没有必要的事件信息(我们称之为B),也能做到这一点将是理想的:

问题是:类
MyAbstractEventListener
如何处理参数类型
E
扩展的信息
IMyEvent
?该类中是否有任何方法处理类型
IMyEvent

如果没有,您可以简单地删除
扩展IMyEvent
,以实现您的目标


否则,您需要一个不同的类,因为
MyAbstractEventListener
依赖于类型
E
扩展(或实现)
IMyEvent

我认为您将无法避免使用两个
handleEvent
方法

但这里有另一种使用设计模式和单个
handleEvent
方法的方法:

    new MyAbstractEventListener<IMyEvent>() {
        @Override
        public void handleEvent(final IMyEvent e) {
            // Method implementation
        }
    };

    new MyAbstractEventListener<NullIMyEvent>() {
        @Override
        public void handleEvent(final NullIMyEvent e) {
            // Method implementation
        }
    };        
    public interface IMyEvent{}

    public class NullIMyEvent implements IMyEvent{}

    public static abstract class MyAbstractEventListener<E extends IMyEvent> {
        public abstract void handleEvent(E e);
    }
新建MyAbstractEventListener(){
@凌驾
公共无效处理事件(最终事件e){
//方法实现
}
};
新的MyAbstractEventListener(){
@凌驾
公共无效处理事件(最终无效处理事件e){
//方法实现
}
};        
公共接口IMyEvent{}
公共类NullIMyEvent实现IMyEvent{}
公共静态抽象类MyAbstractEventListener{
公开摘要无效手册(E);
}

我认为您无法避免使用两种
handleEvent
方法,就像您在这里描述的那样

但这里有另一种使用设计模式和单个
handleEvent
方法的方法:

    new MyAbstractEventListener<IMyEvent>() {
        @Override
        public void handleEvent(final IMyEvent e) {
            // Method implementation
        }
    };

    new MyAbstractEventListener<NullIMyEvent>() {
        @Override
        public void handleEvent(final NullIMyEvent e) {
            // Method implementation
        }
    };        
    public interface IMyEvent{}

    public class NullIMyEvent implements IMyEvent{}

    public static abstract class MyAbstractEventListener<E extends IMyEvent> {
        public abstract void handleEvent(E e);
    }
新建MyAbstractEventListener(){
@凌驾
公共无效处理事件(最终事件e){
//方法实现
}
};
新的MyAbstractEventListener(){
@凌驾
公共无效处理事件(最终无效处理事件e){
//方法实现
}
};        
公共接口IMyEvent{}
公共类NullIMyEvent实现IMyEvent{}
公共静态抽象类MyAbstractEventListener{
公开摘要无效手册(E);
}

B必须有一个“is-a”与
MyAbstractEventListener的关系如果您有一个需要或不需要事件信息的混合或处理程序,您可以提供一些详细信息,如您计划如何调用handleEvent方法吗?例如,假设您有一个类,它是事件调度器,或者可能是事件的源…每当事件发生时,它就会被调用调用所有侦听器,对于那些可以处理事件信息类的侦听器,例如X,它将调用handleEvent(X),但是对于那些不能处理信息的侦听器,它只调用handleEvent()?是这样吗?有没有可能您的侦听器的事件类与该事件信息类不匹配?您怎么能弄清楚?我认为调度程序代码非常重要,以便弄清楚这里的最佳设计是什么。为那些需要的侦听器保留单独的侦听器列表和类可能并不可怕事件信息和那些不这样做的。@ValentinRuano我添加了一个使用该类的示例。我希望它有用。B必须有一个“is-a”与
MyAbstractEventListener的关系如果您有一个需要或不需要事件信息的混合或处理程序,您可以提供一些详细信息,如您计划如何调用handleEvent方法吗?例如,假设您有一个类,它是事件调度器,或者可能是事件的源…每当事件发生时,它就会被调用调用所有侦听器,对于那些可以处理事件信息类的侦听器,例如X,它将调用handleEvent(X),但是对于那些不能处理信息的侦听器,它只调用handleEvent()?是这样吗?有没有可能您的侦听器的事件类与该事件信息类不匹配?您怎么能弄清楚?我认为为了弄清楚这一点,dispatcher代码非常重要
public abstract class MyAbstractEventListener<E extends IMyEvent> {
    new MyAbstractEventListener<IMyEvent>() {
        @Override
        public void handleEvent(final IMyEvent e) {
            // Method implementation
        }
    };

    new MyAbstractEventListener<NullIMyEvent>() {
        @Override
        public void handleEvent(final NullIMyEvent e) {
            // Method implementation
        }
    };        
    public interface IMyEvent{}

    public class NullIMyEvent implements IMyEvent{}

    public static abstract class MyAbstractEventListener<E extends IMyEvent> {
        public abstract void handleEvent(E e);
    }