# The `ToJava` trait
The `ToJava` trait is part of the Duchess prelude.
It defines an `&self` method `to_java` that can be used to convert Rust values into Java objects;
if those Rust types are references to a Java object, then the result is just an identity operation.
The result of `to_java` is not the Java itself but rather a [`JvmOp`] that produces the Java object.
[`JvmOp`]: ./jvm_op.md
In some cases, the same Rust type can be converted into multiple Java types.
For example, a Rust Vec can be converted into a Java `ArrayList` but also a Java `List` or `Vector`.
The `to_java` method takes a type parameter for these cases that can be specified with turbofish,
e.g., `vec.to_java::<java::util::List<_>>()`.
## Examples
### `String`
The Rust `String` type converts to the Java string type.
One could compute the Java `hashCode` for a string as follows:
```rust,ignore
use duchess::prelude::*;
use duchess::java;
let data = format!("Hello, Duchess!");
let hash_code: i32 =
data.to_java::<java::lang::String>() // Returns a `JvmOp` producing a `java::lang::String`
.hash_code() // Returns a `JvmOp` invoking `hashCode` on this string
.execute()?; // Execute the jvmop
```
### `Java<java::lang::String>`
Converting a Rust reference to a Java object, such as a `Global` reference, is an identity operation.
```rust,ignore
use duchess::prelude::*;
use duchess::java;
// Produce a Global reference from a Rust string
let data: Java<java::lang::String> =
format!("Hello, Duchess!").execute()?;
// Invoke `to_java` on the `Global` reference
let hashCode: i32 =
data.to_java::<java::lang::String>() // Returns a `JvmOp` producing a `java::lang::String`
.hashCode() // Returns a `JvmOp` invoking `hashCode` on this string
.execute()?; // Execute the jvmop
```
## Deriving `ToJava` for your own types
Duchess provides a derive for `ToJava` that you can apply to structs or enums.
Details can be found in the [dedicated book section covering derive](./derive.md).