类型安全:从Object中取消选中

Mat*_*hew 43 java casting unchecked type-safety

我尝试将一个对象强制转换为我的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();
 }
 [...]
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助

Jon*_*eet 64

是的 - 这是类型擦除的自然结果.如果o实际上是一个Action<String>不会被演员捕获的实例- 当你尝试使用它时,你只能看到问题,ClientInterface而不是传递一个字符串.

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

@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)

作为函数注释,但你不能轻易地解决潜在的问题:(


mer*_*ike 15

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

详细说明他答案的不易部分:

特定

class ClientAction implements Action<ClientInterface> {}
Run Code Online (Sandbox Code Playgroud)

你可以写:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();
Run Code Online (Sandbox Code Playgroud)

这样就消除了强制转换和警告,但代价是引入了非泛型类型,因此您可以使用它.class来获得足够准确的类型Class对象.


Eya*_*der 6

警告意味着即使在运行时铸件工作正常,编译器也无法保证类型安全.由于擦除,在运行时,转换只是对Action的转换.底层泛型类可能不是预期的ClientInterface类型.在这种情况下,问题将在稍后(可能甚至更晚)出现,作为ClassCastException.

在这种特定情况下,我建议通过以下编译器指令来抑制此特定警告:

@SuppressWarnings("unchecked")
Run Code Online (Sandbox Code Playgroud)