在文档中指出
impl<T> Borrow<T> for T where
T: ?Sized,
我会读这个:
此特性适用于每种类型,甚至是大小不一的类型。
这正确吗?
我收到错误消息:
std::borrow::Borrow<T>
尚未实现特征&num_complex::Complex<f64>
我无法理解
(我不想发布整个代码,我只想澄清一下哪些类型实现了std :: borror :: Borrow)
答案 0 :(得分:1)
要认识的重要一点是,在毯子impl
中只有一个T
,它必须在两个地方都表示 same 类型:
impl<T> Borrow<T> for T
where T: ?Sized
对于每种类型T
的实现,仅特定特征Borrow<T>
。 i64
实现Borrow<i64>
,String
实现Borrow<String>
,依此类推。当我们用T = &num_complex::Complex<f64>
实例化它时,实现了什么特征?
impl Borrow<&num_complex::Complex<f64>> for &num_complex::Complex<f64> // (not compilable code, just illustrative)
换句话说,您可以借用&Complex<f64>
和&Complex<f64>
来借用T
,但是您不能借用任何T
的借口(这不会借用还是很有道理的。)
您正在某些通用代码中使用此代码,其中impl
可以是任何东西,因此Borrow<T> for T
的总括where num_complex::Complex<f64>: Borrow<T>
不适用。您可以通过添加特征绑定来解决此问题:
Complex<f64>
这意味着Borrow<T>
本身实现了where for<'a> &'a num_complex::Complex<f64>: Borrow<T>
,或者
Complex<f64>
,这意味着对Borrow<T>
的任何引用都会实现FROM maven:3.6.0-jdk-11-slim AS build
COPY src src
COPY pom.xml .
RUN mvn -f pom.xml clean package install
FROM openjdk:8-jre
COPY --from=build /target /opt/target
WORKDIR /target
RUN ls
CMD ["java", "-jar", "Customer.jar"]
。取决于您的实际代码,由于autoref / autoderef,这两种方法中的一种或两种都可能起作用。