我创建了一个状态机,并希望它利用java中的泛型.目前我没有看到我可以使这项工作的方式,并获得漂亮的代码.我确定此设计问题已经多次接近,我正在寻找一些输入.这是一个粗略的轮廓.
class State { ... }
Run Code Online (Sandbox Code Playgroud)
每个不同的状态对象只有一个副本(大多数是与静态最终变量绑定的匿名类),它具有每个状态的自定义数据.每个状态对象都有一个状态父(有一个根状态)
class Message { ... }
Run Code Online (Sandbox Code Playgroud)
每条消息都是单独创建的,每条消息都有自定义数据.他们可以互相分类.有一个根消息类.
class Handler { ... }
Run Code Online (Sandbox Code Playgroud)
每个处理程序只创建一次并处理特定的状态/消息组合.
class StateMachine { ... }
Run Code Online (Sandbox Code Playgroud)
当前跟踪当前状态,以及所有(State,Message) - > Handler映射的列表.它还有其他功能.我试图保持这个类通用,并使用类型参数对其进行子类化,因为它在我的程序中使用了很多次,并且每次使用不同的Message's/State's和Handler's.不同StateMachine的将有不同的参数给他们的处理程序.
让状态机跟踪所有映射.
class StateMachine<MH extends MessageHandler> {
static class Delivery {
final State state;
final Class<? extends Message> msg;
}
HashMap<Delivery, MH> delegateTable;
...
}
class ServerStateMachine extends StateMachine<ServerMessageHandler> {
...
}
Run Code Online (Sandbox Code Playgroud)
允许我为这个特定的状态机拥有自定义处理程序方法.可以覆盖handler.process方法的参数.但是,处理程序无法通过消息类型进行参数化.
问题:这涉及instanceof对每个消息处理程序使用健全性检查(确保它获得它期望的消息). …
interface A {
String n();
}
class B implements A {
@Override
public String n() { return "asdf"; }
}
interface C<T extends A> {
T m(T t);
}
class D implements C<B> {
@Override
public B m(B b) {
return b;
}
}
Class<C<? extends A>> x = D.class;
Run Code Online (Sandbox Code Playgroud)
最后一行有错误
Type mismatch: cannot convert from Class<D> to Class<C<? extends A>>
Run Code Online (Sandbox Code Playgroud)
这看起来对我很好,但也许我错过了类型通配符如何工作的一些微妙之处.有没有办法可以改变最后一行的类型?我需要这个参考,因为我打算稍后这样做:
B b = new B();
A y = x.newInstance().m(b);
Run Code Online (Sandbox Code Playgroud)
这也有错误
The method m(capture#1-of ? extends A) in the …Run Code Online (Sandbox Code Playgroud) 我在a上画了一堆瓷砖Canvas,这些瓷砖用Images或BufferedImages表示.
我注意到我用毫秒绘制了Images但是我开始使用BufferedImages作为瓦片,帧时间天空火箭发射到20ms以上.
BufferedImage buffered = ImageIO.read(new File(fileName));
Image image = Toolkit.getDefaultToolkit().createImage(fileName);
Run Code Online (Sandbox Code Playgroud)
这两个图像都支持alpha通道.我想开始使用alpha功能Image的中间缓冲区.但是我没有在jdk中找到一个可以生成它们的地方,除了这个Toolkit调用从文件创建一个.
基本上有谁知道如何从头开始创建一个可以支持alpha的空白图像(而不是BufferedImage)?
class P(val a: Int, val b: Int)
val listp = List[P](new P(2,1))
listp.sortWith( (p1, p2) => p1.b < p2.b )
listp.sortBy(p => (p.b))
Run Code Online (Sandbox Code Playgroud)
listp 很容易排序
val list = List((2, 1))
list.sortWith( (a1, b1), (a2, b2) => b1 < b2) // Too many arguements
list.sortWith( ((a1, b1), (a2, b2)) => b1 < b2) // Not a legal formal parameter / <error> is already defined as <error>
list.sortBy((a, b) => (b)) // wrong number of parameters expected
Run Code Online (Sandbox Code Playgroud)
我该如何排序list?列表的所有方法调用都会导致编译错误(我知道我忽略了返回值,我只关心语法).
我只是在寻找匿名函数的语法.我知道可以Ordered …