当前位置: 首页 > 知识库问答 >
问题:

Java:使用泛型类型去掉if else

井昊乾
2023-03-14

在我的代码中,我使用了许多if-else语句。我了解到if-else和switch语句并不是一种优雅的编码方式,有没有好的方法可以重构下面的代码?

墙壁、陷阱、门和地板是瓷砖的子类

    public class Player{
    ...
        public void move(DIR dir) throws Exception {
            Position nextPos = checkMove(dir);
            Tile nextTile = TileManager.getTileType(nextPos.getSeq());
            if (nextTile instanceof Floor) {
                walk();
            } else if (nextTile instanceof Wall) {
                block();
            } else if (nextTile instanceof Trap) {
                trap();
            } else if (nextTile instanceof Door) {
                unlock();
            }
        }
        public void walk(){
            ...
        }
        public void block(){
            ...
        }
        public void trap(){
            ...
        }
    ...
    }

我试图通过使用方法重载来解决这个问题

public void move1(DIR dir) throws Exception {
    Position nextPos = checkMove(dir);
    System.out.println(nextPos);
    Tile nextTile = TileManager.getTileType(nextPos.getSeq());
    moveTo(nextTile);
} 
public void moveTo(Floor next) throws Exception {
    walk();
}
public void moveTo(Wall next) throws Exception {
    block();
}
...

并且存在编译错误

Player类型中的方法move1(Floor)不适用于参数(Tile)

我读过一些帖子,建议泛型类型可能是一个解决方案,但我不知道如何实现它。

共有2个答案

段铭晨
2023-03-14

好吧,风格取决于语言。您可以在一个项目中混合使用 Java 和 Kotlin:https://kotlinlang.org/docs/tutorials/mixing-java-kotlin-intellij.html

您可以在现有的Java项目中创建一个Kotlin文件,如下所示(未测试):

when (nextTile) {
   is Floor -> walk()
   is Wall -> block()
   is Trap -> Trap()
   is Door -> unlock()
   else -> throw IllegalArgumentException("Unknown expression")
}

看看吧

https://try.kotlinlang.org/#/KotlinKoans/简介/智能铸造/Task.kt

https://kotlinlang.org/docs/reference/typecasts.html

施阳夏
2023-03-14

我已经了解到,如果else和switch语句不是一种优雅的编码方式,那么有没有一种重构以下代码的好方法?

一个可能的解决方案是向 Tile 添加一个抽象方法,我们称之为 action()。(随意想出一个更好的名字。然后你可以做 nextTile.action() 而不用 if 语句。然后将 Floor.walk() 重命名为 Floor.action(),并类似地为每个 Tile 子类使用其他专用方法。这有一个额外的好处,你可以创建新的 Tile 子类,move() 将能够在不做任何更改的情况下处理它们。

 类似资料:
  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 我有一个关于Java仿制药的问题。假设我有以下方法: 我如何用通配符<解释上面的类型转换?扩展U>?使用它与只使用有什么区别?

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo

  • 我需要将包含类型为Pair的对象的列表序列化为xml 首先,我创建了一个类PairList来保存对的列表,然后我创建了一个实际的类,它表示一对两个值,key和value。 然后,我尝试序列化它: 不幸的是,我遇到了一个异常:。欢迎任何关于如何避免此异常并序列化该类的想法。 如果我选择不序列化ttype和utype字段(通过将其设置为受保护或私有),则序列化有效。我不明白为什么它不想序列化类型字段。

  • 问题内容: 我正在为apache HttpClient包实现一个,如下所示: 但我希望函数不返回任何值,即。这可能吗?由于不是有效的Java类型,因此以下内容无法编译: 我想可以替换为以返回对象,但这并不是我真正想要的。 问 :是否有可能安排在这样一种方式,我可以返回此回调局面从? 问题答案: 泛型仅处理对象类。泛型不支持void和基本类型,您不能将它们用作参数化类型。您必须改用Void。 你能说