Я держу кусок mysql-коннектора с моим проектом, а не в Javahome. В результате вы можете быть уверены, что его можно найти, убедившись в его локальном пути к классам. Большой потенциал заключается в том, что вы можете увеличить проект на другой машине и не беспокоиться о (или забыть), чтобы настроить его снова. Мне лично нравится включать его в управление версиями.
Listener
является признаком, поэтому Box<Listener>
действительно действительно объект признака, Box<dyn Listener>
- к сожалению, ключевое слово dyn
в настоящее время является необязательным. Оба Box<dyn Listener>
и &Mouse
реализуют Deref
, со связанным типом Target
, который реализует Listener
. В случае &Mouse
значение deref Target
равно Mouse
, но в случае Box<dyn Listener>
это неизвестный объект, dyn Listener
из неизвестного размера .
Чтобы собрать всю эту информацию, вы можете написать f
так:
fn f<T, L>(_listener: &T)
where
T: Deref<Target = L>,
L: Listener + ?Sized
{
}
И вызывать ее из каждой функции следующим образом:
fn fbox(listener: &Box<dyn Listener>) {
f(listener);
}
fn fref<L>(listener: &L)
where
L: Listener
{
f(&listener);
}
Deref
и просто использовать обычные ссылки. Используйте Box::as_ref
, чтобы превратить Box
в ссылку, чтобы вызвать ее. Неограниченное ограничение ?Sized
все еще необходимо для случая объекта черты, и все еще работает, так как значение всегда находится за указателем:
fn fbox(listener: &Box<dyn Listener>) {
f(listener.as_ref());
}
fn fref<L>(listener: &L) where L: Listener {
f(listener);
}
fn f<L>(_listener: &L)
where
L: Listener + ?Sized
{
}