Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么抑制此未检查的警告是安全的?_Java_Generics_Effective Java - Fatal编程技术网

Java 为什么抑制此未检查的警告是安全的?

Java 为什么抑制此未检查的警告是安全的?,java,generics,effective-java,Java,Generics,Effective Java,考虑UnaryFunction接口,该接口在effectivejava泛型一章中定义 public interface UnaryFunction<T> { T apply(T arg); } 为什么将IDENTITY\u函数转换为(UnaryFunction)是安全的 这本书是关于我要问的问题的,但我不能理解这里的逻辑。我们在哪里调用执行标识操作的apply函数?我很困惑,因为它是一个函数,它返回传递给它的相同对象,而不修改任何内容 将IDENTITY_函数强制转换为(Unary

考虑
UnaryFunction
接口,该接口在effectivejava泛型一章中定义

public interface UnaryFunction<T> {
T apply(T arg);
}
为什么将
IDENTITY\u函数
转换为
(UnaryFunction)
是安全的

这本书是关于我要问的问题的,但我不能理解这里的逻辑。我们在哪里调用执行标识操作的
apply
函数?我很困惑,因为它是一个函数,它返回传递给它的相同对象,而不修改任何内容

将IDENTITY_函数强制转换为
(UnaryFunction)
会生成一个 未选中强制类型转换警告,因为
UnaryFunction
不是
UnaryFunction
用于每个
T
。但身份功能是特殊的:它 返回未修改的参数,因此我们知道使用它是类型安全的 无论
T
的值是多少,它都是一个
UnaryFunction
。因此,我们可以 自信地抑制由生成的未选中强制转换警告 这个演员。一旦我们完成了这项工作,代码编译时就不会出现错误或错误 警告

带类型擦除

T apply(T arg);
实际上是

Object apply(Object arg);
现在是身份问题

Abc x = ...;
Abc y = IDENTITY.apply(x);
我们可以假设它总是正确的(相当于
y=x;


(非常实用。)

仅当标识函数返回最初传递给它的精确的对象时,强制转换才是安全的。因此,在运行时,通用参数
T
的专门化不会违反强制转换

Aka,您正在将对象强制转换为它自己的类型。

identityFunction()只返回函数本身,用于不同的对象

以下是一个使用示例:

String result = identityFunction().apply("Hello");
类型安全警告很重要。这是因为IDENTITY_函数的实现使得编译器无法保证该函数返回与输入相同的类型。 考虑下面的替代实现:

private static UnaryFunction<Object> CONST_FUNCTION = new UnaryFunction<Object>() {
    public Object apply(Object arg) { return "Default"; } 
};
private static UnaryFunction CONST_FUNCTION=new UnaryFunction(){
公共对象应用(对象arg){返回“默认”;}
};
这个实现总是返回一个字符串,因此在泛型数据类型上以一元函数的形式返回它显然是不安全的


在我们的例子(IDENTITY_函数)中,返回类型与输入类型相同的证明在实现内部。我们返回相同的实例,因此保证它具有相同的类型。当您禁止使用类型安全警告时,建议使用证明来证明其合理性。

附带问题:您使用的是哪本书,它是否说明了此代码的要点?@Jeff Efficial java是书名,它在泛型一章中,特别是在描述泛型函数的部分中。-1。IdentityFunction()不返回“函数本身”,而是返回参数本身。我看不出为什么T型的结果是“用于不同的对象”。在您的示例中,它是一个不能在不同对象上使用的字符串。@user949300:
identityFunction()
返回对存储在变量
IDENTITY\u FUNCTION
中的对象的引用。该引用允许您调用
apply()
,从而
identityFunction()
有效地返回函数本身。如果名字不一样就更好了。Ex
getIdentityFunction()
IDENTITY\u函数
。答案的第一行是指getter方法。谢谢-理解。整个问题/系统对于一些什么都不做的东西来说非常混乱:-)。但是,由于StackOverflow中的限制,在您编辑答案之前,我无法“撤消”我的否决票。每当应用identityFunction(.apply)时,结果都会被指定为t IDENTITY.apply(t),这通常无法完成,因为运行时参数的t不在那里。
private static UnaryFunction<Object> CONST_FUNCTION = new UnaryFunction<Object>() {
    public Object apply(Object arg) { return "Default"; } 
};