如何将 instanceof 类型分配给变量?

How to assign instanceof type to a variable?

我想知道是否可以以及如何将 type 引用存储到变量中,以便以后可以与 instanceof 运算符一起使用。

例如

Book book = new Book("My Favourite Book", "Some Author");

BookType bookType = Book;

if(book instanceof bookType){
    // Do something
}

不必硬编码:

Book book = new Book("My Favourite Book", "Some Author");

if(book instanceof Book){
    // Do something
}

是否可以使用反射从 Book.class 获取 Book type

我没有找到太多关于这个主题的信息。

请注意,这与使用

不同
Book.class.isInstance(book);
Object value = Book.class.cast(book);

因为我会失去本书的所有方法 class。

最接近您最初要求1的是这样的:

   Class<?> clazz = Book.class;

   Object someObject = new Book(...);
   
   if (clazz.isInstance(someObject)) {
      Object instanceOfClazz = clazz.cast(someObject);
      // ...
   }

(请注意,此问答 - Is there something like instanceOf(Class<?> c) in Java? - 直接回答问题标题中的问题。)

但是您 objected cast 调用的结果:

"would lose all the methods of the Book class".

首先,这在技术上是不正确的。 instanceOfClazz 所指的 object 仍然是并且将永远是 Book。它仍然拥有并将永远拥有 Book.

的所有方法

但你确实有一点(我认为)。您不能在上面的代码中有效地使用 cast 调用的结果,因为您将它分配给了一个类型为 Object 的变量。并且您不能通过 static 类型为 Object.

的变量/值调用 Book 方法

如果我们这样写:

   Class<Book> clazz = Book.class;

   Object someObject = new Book(...);
   
   if (clazz.isInstance(someObject)) {
      Book book = clazz.cast(someObject);
      // call some `Book` methods.
   }

现在您可以在 book 上调用 Book 方法。但问题是我们必须写 Class<Book> 而不是 Class<?>(或 Class)才能完成这项工作。所以我们最终将 class 名称 Book 连接到代码中。糟糕!

根本问题是 Java 代码无法对 object 进行常规方法调用,除非编译器知道它的类型是什么......并且它有这些方法。如果你想在变量的静态类型是(比如)Object 的情况下调用 Book 方法,那么你必须使用反射来做到这一点。像这样:

  if (clazz.isInstance(someObject)) {
      Method method = clazz.getMethod("setNosPages", int.class);
      method.invoke(someObject, 99);
  }

并处理可能抛出的各种异常。

基本上,您在代码中按名称引用 class 和方法,或者使用反射。


"I need to assign the object/value parsed from a json to a field of type Book (or other types accordingly) of another class."

这是行不通的。 Java 是一种静态类型语言2。想出另一种方法来解决问题。比如使用反射给字段赋值。


1 - 也就是...你的问题原来问的是什么话!
2 - 好的......那就是 over-simplifying.