Аргумент типа null должен быть явно приведен к классу <?> [] Для вызова метода varargs - PullRequest
16 голосов
/ 07 апреля 2011

Пожалуйста, посмотрите на следующий пример: первый вызов getMethod() вызывает предупреждение в Eclipse.Второй не работает и завершается с NoSuchMethodException.

Аргумент типа null должен быть явно приведен к Class<?>[] для вызова метода varargs getMethod(String, Class<?>...) извведите Class<Example>.В качестве альтернативы он может быть приведен к классу для вызова varargs.

Я последовал за предупреждением, и больше ничего не работало.

import java.lang.reflect.Method;


public class Example
{
  public void exampleMethod() { }

  public static void main(String[] args) throws Throwable
  {
   Method defaultNull = Example.class.getMethod("exampleMethod", null);         
   Method castedNull = Example.class.getMethod("exampleMethod", (Class<?>) null);
 }
}

Второй вызов вызывает эту ошибку:

Exception in thread "main" java.lang.NoSuchMethodException: 
    Example.exampleMethod(null)
        at java.lang.Class.getMethod(Class.java:1605)
        at Example.main(Example.java:12)

Может кто-нибудь объяснить мне это поведение?Как правильно избежать предупреждения?

Ответы [ 3 ]

37 голосов
/ 08 апреля 2011

Второй параметр метода getMethod является аргументом VarArg.Правильное использование: если отраженный метод не имеет параметра, второй параметр указывать не следует.Если у отраженного метода есть параметр, то каждый параметр должен быть указан следующим образом:

import java.lang.reflect.Method;


public class Example {

    public void exampleMethodNoParam() {
        System.out.println("No params");
    }

    public void exampleMethodWithParam(String arg) {
        System.out.println(arg);
    }

    public static void main(String[] args) throws Throwable {
        Example example = new Example();
        Method noParam = Example.class.getMethod("exampleMethodNoParam");
        Method stringParam = Example.class.getMethod("exampleMethodWithParam", String.class);
        noParam.invoke(example);
        stringParam.invoke(example, "test");
        //output 
        //No params
        //test
    }
}

ОБНОВЛЕНИЕ

Итак, в вашем случае, когда вы указываете null компилятор не знает, какой тип вы указали.Когда вы пытаетесь привести null к классу, который неизвестен, но в любом случае является классом, вы получаете исключение, потому что нет

public void exampleMethod(Class<?> object) { }

подписи exampleMethod.

3 голосов
/ 14 марта 2012

Метод getMethod, определенный в API Java:

Method java.lang.Class.getMethod(String name, Class<?>... parameterTypes) 

Если метод, который вы вызвали, не имеет аргументов, то вы должны предоставить пустой массив или массив с длиной 0 для второго аргумента. Например:

Method defaultNull = Example.class.getMethod("exampleMethod", new Class<?>[0]);

Вызовите метод, вы также должны установить пустой массив.

defaultNull.invoke(example , new Object[0]);
1 голос
/ 08 апреля 2011

Вы не разыграли null до Class<?>[], вы разыграли его до Class<?>. Поскольку ни один метод не соответствует этой подписи, он генерирует исключение Исправьте ваше приведение, чтобы правильно идентифицировать массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...