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()
有效地返回函数本身。如果名字不一样就更好了。ExgetIdentityFunction()
和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"; }
};