有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检查对象是否是类和强制转换列表中的类的实例

我的对象在运行时可能有很多类。目前,为了检查它是哪个类,我有一些if语句,比如

    int id = 0;
    if (object instanceof Comment) {
        id = ((Comment) object).getId();
    }
    if (object instanceof Follow) {
        id = ((Follow) object).getId();
    }
    if (object instanceof Like) {
        id = ((Like) object).getId();
    }
    if (object instanceof Post) {
        id = ((Post) object).getId();
    }
    if (object instanceof User) {
        id = ((User) object).getId();
    }

这很管用,但感觉不太干净。我看了一下Check if an object is an instance of any one of a list of classes (Android),它提供了一种方法来检查对象是否是一个类列表中的类的实例,比如

if(myClasses.contains(obj.getClass())) {
   // obj is one of the classes I care about, so do something
}

然而,这不起作用,因为我需要继续并将对象强制转换到该类

有没有人知道一种更干净的方法来bot检查我的对象类型是一个类列表中的一个类,然后将该对象强制转换到该类

差不多

if(myClasses.contains(object.getClass())) {
   ((CLASS_THAT_MATCHED) object).getId()
}

注意当然,通常我只会让所有的类都是一个超类的子类,这个超类有getID方法和我需要的其他方法。然而,在这个特定的实例中,这些类都需要是库类的子类。让它们从一个基类继承会破坏库中的代码。我知道这在图书馆方面是一个糟糕的设计问题,但我无法解决


共 (3) 个答案

  1. # 1 楼答案

    Re@Alberto Sinigalia solution

    它工作得很好。。。但是在所有必要的演员阵容之后看起来很可笑;),例:

        ...
    
        Object obj = new Comment();
    
        List<?> list = new ArrayList<>() {
            private static final long serialVersionUID = 4804401786243829831L;
            {
                add(Comment.class);
                add(Message.class);
                add(Post.class);
            }
        };
    
        Integer id = (Integer) list.stream().filter(c -> ((Class<?>) c).isInstance(obj))
                .map(c -> (Integer) ((I_ObjectType) ((Class<?>) c).cast(obj)).getObjectId()).findFirst().orElse(null);
    
        System.out.println("result?=" + id);
    
        ...
    

    每个类实现:

    public interface I_ObjectType {
        int getObjectId();
    }
    
  2. # 2 楼答案

    你需要使用多态性。例如,创建一个接口

    public interface Message {
        int getId();
    }
    

    让你的类来实现它。然后可以对它们中的每一个调用getId方法。此外,还可以创建一个抽象类,该类具有Post等类的基本功能。差不多吧

  3. # 3 楼答案

    However in this specific instance these classes all need to be subclasses of a libraries class

    然后你应该使用interface

    public interface HasId{
       int /* or whatever type is the ID*/ getId();
    }
    
    public class Like extends LibrarySuperClass implements HasId{
       ...
    }
    

    但是,如果LikePost等也是库类,则可以执行以下操作:

    // UNTESTED
    
    Object obj =...;
    List list = List.of(
      Like.class,
      Follow.class,
      Comment.class,
      User.class,
      Post.class,
    );
    Integer id = list
      .stream()
      .filter(class -> class.isInstance(obj))
      .map(class -> (Integer) class.cast(obj).getId())
      .findFirst()
      .orElse(null);