То, что вы написали, не имеет смысла с лингвистической точки зрения. Foo
- это тип, а тип не является переменной и не может появляться в LHS присвоения. Вы не можете рассматривать тип как значение в Java ... язык не допускает этого.
Самое близкое, что вы можете получить к тому, что вы пытаетесь сделать, это что-то вроде этого:
Class fooClass;
if (loadFoo1) {
fooClass = Class.forName("some.pkg.Foo1");
} else {
fooClass = Class.forName("some.pkg.Foo2");
}
Foo foo = (Foo) fooClass.newInstance(); // using the no-args constructor
(я исключил обработку исключений ...)
Обратите внимание, что fooClass
будет экземпляром класса Class
, который предоставляет дескрипторы времени выполнения, которые используются для рефлексивного выполнения операций. Мы на самом деле не присваиваем тип. Мы присваиваем объект, который «обозначает» тип ... ограниченным образом.
ОДНАКО ... если вам не нужен для использования динамической загрузки, вы не должны его использовать. Другими словами, если основная проблема, которую вы пытаетесь решить, это создание экземпляров классов, которые могли бы быть статически загружены, тогда лучше использовать шаблон фабрики; см. ответ @ andersoj, например.
UPDATE
Я только что понял, что вы, вероятно, пытаетесь сделать здесь. То есть вы пытаетесь найти способ выбора между различными статическими методами (т. Е. Foo1.method()
и Foo2.method()
) без явного присвоения имен классам в точке, где выполняется вызов.
Опять же, то, что вы пытаетесь сделать, просто не будет работать в Java:
- Вы не можете объявить статический метод в интерфейсе.
- Вы не можете вызывать статический метод в классе реализации через интерфейс.
- Статические вызовы методов не отправляются в Java. Они связаны статически.
Есть способ сделать что-то вроде этого, используя отражение; например,
Class fooClass;
// Load one or other of the classes as above.
Method m = fooClass.getDeclaredMethod("method");
Integer res = (Integer) m.invoke(null);
(Как и прежде, я исключил обработку исключений)
Еще раз, вам было бы гораздо лучше сделать это, не прибегая к динамической загрузке и отражению. Простой подход заключается в создании вспомогательного метода, подобного этому, в классе некоторых утилит:
public static int method() {
return useFoo1 ? Foo1.method() : Foo2.method();
}
Более того, сделайте это OO-способом: объявите method
в интерфейсе Foo
как метод экземпляра, создайте одиночный или внедренный экземпляр Foo1
или Foo2
и полагайтесь на полиморфизм.
Но дело в том, что НЕТ СПОСОБА избегать изменения всех мест в вашей кодовой базе, где вызывается method()
... если вы хотите иметь возможность выбирать между Foo1.method
и Foo2.method
во время выполнения .