我正在尝试创建一个 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/