小编aep*_*iet的帖子

java泛型设计问题(状态机)

我创建了一个状态机,并希望它利用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的将有不同的参数给他们的处理程序.

方法A.

让状态机跟踪所有映射.

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对每个消息处理程序使用健全性检查(确保它获得它期望的消息). …

java generics design-patterns state-machine

17
推荐指数
1
解决办法
2768
查看次数

为什么这种类型的通配符不起作用?

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)

java generics

5
推荐指数
1
解决办法
99
查看次数

没有使用缓冲图像的alpha通道的java图像

我在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)?

java alpha image

1
推荐指数
1
解决办法
6935
查看次数

用于排序匿名列表的语法

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 …

sorting scala

1
推荐指数
2
解决办法
873
查看次数

标签 统计

java ×3

generics ×2

alpha ×1

design-patterns ×1

image ×1

scala ×1

sorting ×1

state-machine ×1