Java 为什么改型广告上写的是;“类型安全”;图书馆?

Java 为什么改型广告上写的是;“类型安全”;图书馆?,java,android,retrofit,retrofit2,type-safety,Java,Android,Retrofit,Retrofit2,Type Safety,我刚看过他们的照片,上面写着 适用于Android和Java的类型安全HTTP客户端 为什么改型宣传自己是类型安全的,而其他库(许多其他流行的库)则不是 在回答之前… 同样的问题也有答案。上面说, 类型安全性是编程语言不鼓励的程度 或防止类型错误。类型错误是错误的或不需要的 不同数据类型之间的差异导致的程序行为 对于程序的常量、变量和方法(函数),例如。, 将整数(int)视为浮点数(float)。这是 在静态类型语言(如Java和C)中常见 因此,改装可防止此类错误 如果这确实是答案,那么许多

我刚看过他们的照片,上面写着

适用于Android和Java的类型安全HTTP客户端

为什么改型宣传自己是类型安全的,而其他库(许多其他流行的库)则不是

在回答之前…

同样的问题也有答案。上面说,

类型安全性是编程语言不鼓励的程度 或防止类型错误。类型错误是错误的或不需要的 不同数据类型之间的差异导致的程序行为 对于程序的常量、变量和方法(函数),例如。, 将整数(int)视为浮点数(float)。这是 在静态类型语言(如Java和C)中常见

因此,改装可防止此类错误

如果这确实是答案,那么许多库可以防止此类错误,但没有一个库作为类型安全的发布。那么这是一种营销手段吗

我认为上述答案是不够的,因为类型安全的定义没有得到重视。 无论如何,类型安全性的定义是不一致的。他们举例说明:

// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";
类型安全性意味着编译器将在 编译,并在尝试将错误类型分配给 变数

一些简单的例子:

// Fails, Trying to put an integer in a string
String one = 1;
// Also fails.
int foo = "bar";
这也适用于方法参数,因为您传递的是显式参数 向他们输入:

int AddTwoNumbers(int a, int b)
{
    return a + b;
}
如果我尝试使用以下方式来调用:

int Sum = AddTwoNumbers(5, "5");
根据上述定义,特定类型安全的是语言(Java),而不是库


所以,我再次问,为什么改型会宣传自己是一个类型安全库?

我的猜测是因为您可以使用自定义类作为请求主体,例如

@GET("/token")
Call<Token> getToken(@Body Credentials credentials);
@GET(“/token”)
调用getToken(@Body-Credentials);

而且您不必总是创建
字符串
。当然,
字符串将在发动机罩下创建,但您永远不必触摸它

首先让我们简要了解一下如何使用改装来提出请求并获得响应。通常您会这样做:

@GET("user/images")
Call<UserImage> getUserImage();
借用你的问题——

类型错误是由于程序常量、变量和方法(函数)的不同数据类型之间存在差异而导致的错误或不希望出现的程序行为,例如,将整数(int)视为浮点数(float)

我相信改型之所以称自己为类型安全的http客户端,是因为它不允许您调用不返回您定义的确切响应的API。例如,如果您的API响应使用“ImageId”而不是“ImgId”(参考上面的示例),则改型将不允许使用它。我相信这是类型安全改进所指的,即特定于序列化和反序列化的类型安全,而不仅仅是将int视为float等,这使得它不仅仅是Java提供的东西

希望这能有所帮助。

查看,类型安全性中的类型似乎是指请求主体和响应主体对象

我们必须记住,改造是在OKHttp上构建的,它只能处理
RequestBody
ResponseBody
对象。改型以能够使用
Converter
s将这些类型安全地序列化到其他类型中或从其他类型中序列化而自豪

类型安全中的安全是指在构建
RequestBody
和解析
ResponseBody
对象时,对所有样板代码进行改造,以确保正确的类型转换。改型附带了几个内置的
Converter
s,它们围绕着流行的序列化库,如GSon和Jackson

TL;博士 受影响的类型安全性是翻新,承担构建HTTP请求和解析DTO之外的HTTP响应的责任


作为开发人员,您可以像往常一样继续使用您选择的序列化库,并且不必担心您在这个问题上的小小头脑。

我没有过多考虑它,但从我开始使用改型的那一刻起,我就把这个标题理解为在更高的抽象层上的类型安全,而不是其他人在这里谈论的内容

通常我们把编程语言作为类型安全与否的“目标”。我认为这不是改造的标题类型安全的情况;)如果我们假设整个HTTP调用是一条编程语言指令(可能有一些参数和值),那么我们确实可以说改型是类型安全的。。。你已经严格定义了你会得到什么样的结果。。你要么得到这个,要么什么也得不到。当然,错误发生在运行时,因为您永远不可能真正知道将从internet检索到什么。当然,许多其他图书馆可以做到这一点,不仅仅是翻新。当然,您可以通过使用ResponseBody类型的返回值(可以接受任何内容)定义服务来误导改装的类型安全性。但一般来说,开箱即用,您将得到一个库,它将为您检查、解析、验证HTTP调用的响应,转换为正确的类型,并且在出现任何问题时,它将给您一个错误

我现在脑海中有一个简单的类比(就类型安全口号而言):

  • 编程语言具有:指令+参数和值的类型

  • 改进有:http调用+主体和响应的结构

致以最良好的祝愿,
Darek

改型之所以宣称它是类型安全的,直接与整个实现是基于反射和注释的这一事实有关。它处理请求主体和响应请求数据的所有转换。它不允许来自任何服务器的响应类型不匹配。因此,类型安全,请记住改造的本质是一个HTTp api,用于客户端和服务器之间的严格契约

类型安全