继承泛型的 java @SuppressWarnings("unchecked") 的语法
Syntax of java @SuppressWarnings("unchecked") with inheritance of generic types
我类定义如下,其中有一些方法
public abstract class Pojo<T extends Pojo<T, U>, U extends Phase<U>> {
...
public T updatePhase(U phase) {
this.previousPhase = this.phase;
this.phase = phase;
return getThis();
}
public U getPreviousPhase(U phase) {
return this.previousPhase;
}
@SuppressWarnings("unchecked")
public T getThis() {
return (T) this;
}
public Map<String, String> getMap() {
return this.map;
}
}
public interface Phase<U extends Phase<U>> { ... }
在我的代码后面的某个地方,我正在尝试执行以下操作:
Pojo pojo = someService.get(id); // This can't be a definite type since I get this by deserializing a string
Phase ap = pojo.getPreviousPhase();
pojo.updatePhase(ap); // I get the unchecked warning here (case 1)
Map<String, String> myMap = pojo.getMap(); // I get the unchecked warning here (case 2)
myMap.put("1", "2"); // This obviously works
案例 1:未经检查的调用 updatePhase(U)
作为原始类型的成员。
我明白为什么会发出警告。在这种情况下(语法方面)如何使用 @SuppressWarnings("unchecked")
注释?如果我将它组合成一个语句,它会如何使用 pojo.updatePhase(pojo.getPreviousPhase)
情况 2:未经检查的转换,需要 Map<String,String>
,找到 Map
为什么会发出警告?我要返回一个明确的类型 Map<String, String>
所以它不应该关心......同样我如何在这里应用 @SuppressWarnings
注释?同样,我将如何在单行语句 pojo.getMap().put("1", "2")
中执行此操作
注意:我确实在我的代码中确保所有这些类型转换都是正确的,并且不会在运行时导致转换错误。
使用原始类型来禁用泛型类型检查不是一个好主意。对于第一个问题,与其试图将未知类型的对象强制为未知类型的泛型方法参数,不如告诉 Pojo
在内部将字段值传递给自己:
public T updateFromPrevious() {
return updatePhase(getPreviousPhase());
}
一旦您停止使用原始类型,编译器将停止忽略这些行上的泛型类型,第二个警告将消失:
Pojo<?,?> pojo = someService.get(id);
pojo.updateFromPrevious();
Map<String, String> myMap = pojo.getMap();
myMap.put("1", "2");
我类定义如下,其中有一些方法
public abstract class Pojo<T extends Pojo<T, U>, U extends Phase<U>> {
...
public T updatePhase(U phase) {
this.previousPhase = this.phase;
this.phase = phase;
return getThis();
}
public U getPreviousPhase(U phase) {
return this.previousPhase;
}
@SuppressWarnings("unchecked")
public T getThis() {
return (T) this;
}
public Map<String, String> getMap() {
return this.map;
}
}
public interface Phase<U extends Phase<U>> { ... }
在我的代码后面的某个地方,我正在尝试执行以下操作:
Pojo pojo = someService.get(id); // This can't be a definite type since I get this by deserializing a string
Phase ap = pojo.getPreviousPhase();
pojo.updatePhase(ap); // I get the unchecked warning here (case 1)
Map<String, String> myMap = pojo.getMap(); // I get the unchecked warning here (case 2)
myMap.put("1", "2"); // This obviously works
案例 1:未经检查的调用 updatePhase(U)
作为原始类型的成员。
我明白为什么会发出警告。在这种情况下(语法方面)如何使用 @SuppressWarnings("unchecked")
注释?如果我将它组合成一个语句,它会如何使用 pojo.updatePhase(pojo.getPreviousPhase)
情况 2:未经检查的转换,需要 Map<String,String>
,找到 Map
为什么会发出警告?我要返回一个明确的类型 Map<String, String>
所以它不应该关心......同样我如何在这里应用 @SuppressWarnings
注释?同样,我将如何在单行语句 pojo.getMap().put("1", "2")
注意:我确实在我的代码中确保所有这些类型转换都是正确的,并且不会在运行时导致转换错误。
使用原始类型来禁用泛型类型检查不是一个好主意。对于第一个问题,与其试图将未知类型的对象强制为未知类型的泛型方法参数,不如告诉 Pojo
在内部将字段值传递给自己:
public T updateFromPrevious() {
return updatePhase(getPreviousPhase());
}
一旦您停止使用原始类型,编译器将停止忽略这些行上的泛型类型,第二个警告将消失:
Pojo<?,?> pojo = someService.get(id);
pojo.updateFromPrevious();
Map<String, String> myMap = pojo.getMap();
myMap.put("1", "2");