Skip to main content

toad_jni/java/
no_upcast.rs

1use std::marker::PhantomData;
2
3use crate::java;
4
5/// Helper type that has `T`'s [`java::Class::PATH`] but
6/// does not invoke [`java::Object::upcast`] on it, preserving
7/// the [`java::lang::Object`].
8pub struct NoUpcast<T>(java::lang::Object, PhantomData<T>);
9
10impl<T> NoUpcast<T> where T: java::Class
11{
12  /// Unwrap, yielding the object reference
13  pub fn object(self) -> java::lang::Object {
14    self.0
15  }
16
17  /// Wraps an object with `NoUpcast<T>`
18  pub fn from_object(o: java::lang::Object) -> Self {
19    Self(o, PhantomData)
20  }
21}
22
23impl<T> java::Class for NoUpcast<T> where T: java::Class
24{
25  const PATH: &'static str = T::PATH;
26}
27
28impl<T> java::Object for NoUpcast<T> where T: java::Class
29{
30  fn upcast(_: &mut java::Env, jobj: java::lang::Object) -> Self {
31    Self(jobj, PhantomData)
32  }
33
34  fn downcast(self, _: &mut java::Env) -> java::lang::Object {
35    self.object()
36  }
37
38  fn downcast_ref(&self, e: &mut java::Env) -> java::lang::Object {
39    self.0.downcast_ref(e)
40  }
41}