Как связать переменную типа метода, который может быть импортирован только статически?
У меня есть два класса под названием Matchers
со статическими методами, которые мне нужно использовать в третьем классе, поэтому один из них можно использовать только через статический импорт. Тем не менее, я не могу явно указать параметры типа (т.е. <Type> method()
) для статически импортированных методов.
Как я могу обойти это без необходимости полностью квалифицировать класс?
3 ответа
Ты не можешь. По крайней мере, не в Java (некоторые другие языки, например, Scala, позволяют вам присвоить псевдоним импортируемому классу, что довольно круто и может быть использовано именно в таком случае).
Здесь вам просто нужно использовать полное имя для обоих классов или для одного класса (и импортировать другой).
Использование 2 классов с одинаковыми именами в одном файле - не лучшая идея, если у вас нет действительно хорошего варианта использования. Может быть, вы действительно можете делать то, что вы хотите, используя только один из Matchers?
Я собираюсь немного почитать здесь, но думаю, что это что-то вроде Hamcrest/Mockito Matchers? Если это так, то в большинстве случаев вам следует использовать только один из них. Если вы оказались в очень печальном случае, когда вам нужны оба, тогда вы неудачники:-)
Есть способ, который может выглядеть немного нечистым, но он покрыт стандартом. Вы можете использовать локальные переменные как импорт. Поскольку их значение не имеет значения для static
вызовы методов, они могут быть инициализированы в null
public class Imports
{
static <T> java.util.List<T> emptyList()
{
System.out.println("Imports.emptyList()");
return java.util.Collections.emptyList();
}
public static void main(String[] args)
{
final java.util.Collections c=null;
final Imports i=null;
System.out.println(c.emptyList());
System.out.println(i.emptyList());
}
}
c.emptyList()
а также i.emptyList()
относятся к разным static
методы здесь. И вы можете даже вставить аргументы типа, например c.<String>emptyList()
, Но некоторые компиляторы могут выдавать предупреждения, которые вы должны отключить для класса, используя этот трюк. Но в некоторых случаях не может быть лучшего способа (повторение квалифицированных имен не всегда лучший способ)…
Придумал очень хакерский путь как альтернативу полной квалификации класса:
Просто реализуйте подкласс рассматриваемого класса и вызовите статический метод родительского класса для подкласса. Это разрешено и даже не генерирует предупреждения компилятора. Поскольку метод является статическим, не задействованы никакие виртуальные методы. Подкласс просто служит псевдонимом (так что лучше сделать его приватным, финальным и так далее).