Как я могу удалить предупреждение unckecked в Java? - PullRequest
3 голосов
/ 16 января 2010

у меня есть этот кусок кода:

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;
 }
}

Часть с " (T) Naming.lookup (адрес) " дает мне предупреждение: " Тип безопасности: непроверенное приведение с удаленного на T "

Я не хочу использовать " @ SuppressWarnings (" unchecked ") ", я просто хочу знать, почему отображается предупреждение, когда " T расширяет Remote " и исправить это (для чистого кода)

Thnaks.

Ответы [ 3 ]

7 голосов
/ 16 января 2010

«Непроверенное приведение» здесь означает, что 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;
  }
}

Таким образом, вы делаете тип T явным и известным во время выполнения.

2 голосов
/ 16 января 2010

Так как Naming.lookup () возвращает Remote, так что ваше приведение фактически не проверено.

Если бы у вас была ручка класса T, вы могли бы использовать:

private Class<T> clazz;
clazz.cast(Naming.lookup(address)); 

, который будет возвращать T. Из-за стирания вам нужно будет указать класс в конструкторе или использовать другие хакеры, например:

1 голос
/ 16 января 2010

Есть несколько предупреждений, связанных с генерированием типов, которые я так и не смог устранить. Я просто сдался и использовал @SuppressWarnings.

Другая альтернатива, в зависимости от IDE, - сделать компилятор менее чувствительным к проблемам. Eclipse позволяет мне выборочно отключать определенные предупреждения. Я нахожу предупреждение «отсутствует серийный UID» в классах Swing GUI (среди прочего) довольно раздражающим и отключает их. Если я буду слишком раздражен этими предупреждениями, то их постигнет та же участь.

...