如何在java中删除unckecked cast警告?

use*_*098 3 java warnings casting unchecked

我有这段代码:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.Remote;
import java.rmi.RemoteException;

public class ClientLookup<T extends Remote> {
 private T sharedObject;

 public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException {
   sharedObject = (T) Naming.lookup(adress);
 }

 public T getSharedObject() {
   return sharedObject;
 }
}
Run Code Online (Sandbox Code Playgroud)

带有" (T)Naming.lookup(地址) "的部分给我一个警告:" 类型安全:未经检查从远程转为T "

我不想使用" @SuppressWarnings("unchecked") ",我只是想知道为什么当" T扩展远程 " 时它会显示警告并修复它(对于干净的代码)

Thnaks.

Joa*_*uer 7

这里的"未经检查的强制转换"意味着Java无法验证要转换的对象T在运行时是否实际上是类型,因为该类型T在运行时是未知的.它最多可以验证它实际上是类型Remote.

此问题的常见解决方法是提供一个Class<T>对象来定义类型:

public class ClientLookup<T extends Remote> {
  private T sharedObject;
  private Class<T> clazz;

  public ClientLookup(Class<T> clazz) {
    this.clazz = clazz;
  }

  public void lookup(String adress) throws MalformedURLException, RemoteException, NotBoundException {
    sharedObject = clazz.cast(Naming.lookup(adress));
  }

  public T getSharedObject() {
    return sharedObject;
  }
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以T在运行时使类型显式且已知.