类型安全:对象中未经检查的强制转换

2022-08-31 22:23:58

我尝试将对象强制转换为我的 Action 类,但它导致警告:

Type safety: Unchecked cast from Object to Action<ClientInterface>

Action<ClientInterface> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<ClientInterface>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

感谢您的任何帮助


答案 1

是的 - 这是类型擦除的自然结果。如果实际上是一个实例,则不会被强制转换捕获 - 您只有在尝试使用它时才会看到问题,传入一个而不是字符串。oAction<String>ClientInterface

您可以使用以下命令摆脱警告:

@SuppressWarnings("unchecked")

作为函数注释,但您无法轻松解决根本问题:(


答案 2

像往常一样,Jon Skeet是对的。

详细阐述他答案中不容易的部分:

鉴于

class ClientAction implements Action<ClientInterface> {}

你可以写:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

这消除了强制转换和警告,代价是引入了非泛型类型,以便您可以使用来获得足够准确的类型化对象。.classClass


推荐