相关疑难解决方法(0)

如何避免使用大型if语句和instanceof

动物

public abstract class Animal {
 String name;

 public Animal(String name) {
  this.name = name;
 }

}
Run Code Online (Sandbox Code Playgroud)

狮子

public class Lion extends Animal {

 public Lion(String name) {
  super(name);
  // TODO Auto-generated constructor stub
 }

 public void roar() {
  System.out.println("Roar");
 }
}
Run Code Online (Sandbox Code Playgroud)

鹿

public class Deer extends Animal {

 public Deer(String name) {
  super(name);
 }

 public void runAway() {
  System.out.println("Running...");
 }

}
Run Code Online (Sandbox Code Playgroud)

TestAnimals

public class TestAnimals {
 public static void main(String[] args) {
  Animal lion = new Lion("Geo");
  Animal deer1 …
Run Code Online (Sandbox Code Playgroud)

java iteration casting

16
推荐指数
3
解决办法
2520
查看次数

经常使用instanceof是好习惯吗?

场景.我正在写与游戏相关的代码.在那个游戏中Player(它也是一个类)有一个列表Item.还有其他类型的项继承Item,例如ContainerItem,DurableItemWeaponItem.

显然,对我来说这是非常方便的List<Item>.但是当我获得玩家物品时,我唯一的方法是通过使用instanceof关键字来区分什么类型的物品.我敢肯定,我已经读过,依赖它是不好的做法.

在这种情况下可以使用它吗?或者我应该重新考虑我的所有结构?

java instanceof hierarchy

11
推荐指数
2
解决办法
5373
查看次数

在重载方法中选择方法时,使Java考虑最具体的类型

我想根据对象的类型执行几个操作,而不使用instanceof.起初我正在考虑基于类型重载方法(如下所示),并认为Java可能会适当地选择方法(基于最具体的对象类).

import java.util.ArrayList;
import java.util.List;


public class TestA {

    public static void main(String[] args)
    {
        List<Object> list = new ArrayList();
        list.add(new A());
        list.add(new B());
        list.add(new C());
        list.add(new Object());

        TestA tester = new TestA();

        for(Object o: list)
        {
            tester.print(o);
        }
    }

    private void print(A o)
    {
        System.out.println("A");
    }

    private void print(B o)
    {
        System.out.println("B");
    }

    private void print(C o)
    {
        System.out.println("C");
    }

    private void print(Object o)
    {
        System.out.println("Object");
    }
}

class A {

}

class B extends A { …
Run Code Online (Sandbox Code Playgroud)

java polymorphism

8
推荐指数
2
解决办法
2042
查看次数

如何找出抽象列表中的对象?

我有一个称为会话的抽象类。讲座和教程扩展了会议。然后,我有一个称为注册的类,其中包含一个会话列表(讲座和教程)。如何在“注册”中的会话列表中循环,并仅从会话列表中返回讲座列表?

我的下一个问题是我应该存储2个列表。一个讲座列表和一个教程列表,而不是一个会话列表?这是因为会话列表对我来说毫无用处,我每次都必须遍历列表以获取有关讲座和教程的信息。有什么办法让我缺少所有讲座的对象吗?我是Java新手。

public class Enrolment {

    private List<Session> sessions;

    public Enrolment() {
        this.sessions = new ArrayList<>();
    }

    public addSession(Session session) {
        this.sessions.add(session);
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Session {

    private int time;

    public Session(int time) {
        this.time = time;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Lecture extends Session {

    private String lecturer;

    public Lecture(int time, String lecturer) {
        super(time);
        this.lecturer = lecturer;
    }
}
Run Code Online (Sandbox Code Playgroud)
public class Tutorial extends Session {

    private String tutor;
    private int tutorScore;

    public Tutorial(int time, String tutor, int tutorScore) …
Run Code Online (Sandbox Code Playgroud)

java loops class list arraylist

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

如何进行安全的向下转换并防止出现ClassCastException

我有以下场景:

public class A {
}

public class B extends A {
}

public class C extends B {
    public void Foo();
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法可以返回类A,BC,我想安全地转换为C,但只有在类类型为C时.这是因为我需要调用Foo()但我不想要ClassCastException.

java casting downcast

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

被认为是有害的?

我正在查看一些大量使用Java instanceof运算符的代码.我会反对细节的诱惑,因为这是一个普遍的问题. instanceof让我想起c ++的动态演员,以及我很久以前读过的关于它的建议,如果你认为你需要它,可能你的模型已经关闭了.这仍然是传统智慧吗?它适用于Java instanceof吗?

java architecture oop refactoring

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

如何确定派生类的类型?

假设我有一个叫做超类animal,和三个子类分别叫DogCat以及Lion扩展了animal类。然后,我为每个子类创建一个对象并将它们添加到ArrayList<animal>.

当我浏览该列表时,如何区分is 中的每个对象都属于类型的对象DogCat对象?ArrayListanimal

java oop inheritance

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