如何将 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.
我想知道是否可以以及如何将 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.