java - 访问者和策略模式中泛型的类型安全

标签 java oop design-patterns

我正在尝试创建一个 Visitor<T>返回某个 strategy对于一个实例对象。 它已经可以工作了,但我无法获取 Generics类型安全。我在以下代码中缺少什么:

class Base;
class Foo extends Base;
class Bar extends Base;

interface Visitor<T> {
    T visit (Foo foo);
    T visit (Bar bar);
}

interface Strategy<T> {
    void action(T obj);
}

class FooStrategy implements Strategy<Foo> {
    @Override
    void action(Foo foo) {
        //perform strategy action on foo
    }
}

//References to generic type Strategy<T> should be parameterized
class MyVisitor implements Visitor<Strategy> {

    //References to generic type Strategy<T> should be parameterized
    @Override
    Strategy visit(Foo foo) {
        return new FooStrategy();
    }

    //References to generic type MyStrategy<T> should be parameterized
    @Override
    Strategy visit(Bar bar) {
        return new BarStrategy();
    }
}

在类里面MyVisitor eclipse 一直提示 Strategy<T>应该参数化。我缺少什么来制作这个通用构造 typesafe

更新:

我想这样使用它:

        Visitor<Strategy> visitor = new MyVisitor();
        Strategy strat = drawable.accept(visitor);

        //use the strategy
        Base object; //may be a Foo or Bar or whatever
        strat.action(object);

最佳答案

你可以输入 ? extends Base到类型参数以表明它是您不关心的任何类型的策略,但它必须是 Base 的子类。

class MyVisitor implements Visitor<Strategy<? extends Base>> {
  @Override
  Strategy<? extends Base> visit(Foo foo) {
    return new FooStrategy();
  }
  @Override
  Strategy<? extends Base> visit(Bar bar) {
    return new BarStrategy();
  }
}

    Visitor<Strategy<? extends Base>> visitor = new MyVisitor();
    Strategy<? extends Base> strat = drawable.accept(visitor);

但是,您不能调用这样的策略:

    //use the strategy
    Base object; //may be a Foo or Bar or whatever
    strat.action(object);  // <--- error.

因为操作方法实际上具有签名

<U extends Base> void action(U object);

即参数的类型可能需要 Base 的任意子类,并且可以传递给 Base 的任意子类的唯一类型是 null

要解决这个问题,只需让 FooStrategy 和 BarStrategy 实现 Strategy<Base> :

class FooStrategy implements Strategy<Base> { void action(Base obj) { ... } }
class BarStrategy implements Strategy<Base> { void action(Base obj) { ... } }

class MyVisitor implements Visitor<Strategy<Base>> {
  @Override
  Strategy<Base> visit(Foo foo) {
    return new FooStrategy();
  }
  @Override
  Strategy<Base> visit(Bar bar) {
    return new BarStrategy();
  }
}

Visitor<Strategy<Base>> visitor = new MyVisitor();
Strategy<Base> strat = drawable.accept(visitor);

Base object;
strat.action(object);

关于java - 访问者和策略模式中泛型的类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15732935/

相关文章:

java - 从 native C 代码(JNI)传递 Java 中的回调函数的多个参数

java - db4o 透明激活 - 检索节点的子值时出现 Null 异常

java - SWT - 获取图像的实际屏幕位置

php - 更新查询只使数据库表字段为空

c++ - cpp静态对象实例化

iphone - 在一个 UIViewController 中嵌入两个 UITableViewController

c++ - 不透明引用而不是 PImpl。是否可以?

java - Mockito 中带有 doNothing() 的非 void 方法?

programming-languages - Smalltalk 有什么特别之处?

java - 类似的输入对话框创建模式/Swing