Обобщения в статических фабричных методах? (Джава) - PullRequest
1 голос
/ 23 сентября 2010

У меня есть задание, которое требует от меня использования фабричного шаблона для реализации неизменяемой структуры данных, но проблема в том, что абстрактный класс является универсальным, а наличие статических методов для создания ссылок на универсальные типы доставляет мне проблемы.Мое задание требует от меня использования статических методов, поэтому я начинаю паниковать.Любая помощь / предложения? EDIT добавлен пример кода, и вот спецификация для одного из методов, которые нам дал профессор. Подпись:

ExampleClass.method1: ExampleClass, T -> ExampleClass

ExampleClass.method2: ExampleClass -> T

public abstract class ExampleClass<T>{

   //static method creates a new subclass of Example ("Push" method)
   public static Class method1(T x, ExampleClass c){
       return new method1(x, f);
    }   

   //Supposed to return an object type T ("pop" method)
   public static T method2(ExampleClass c){
       return c.method2Dynamic();
   }

оба эти метода, которые у меня есть, вызывают проблемы в затмении.

Ответы [ 3 ]

3 голосов
/ 23 сентября 2010

Я не знаю, что вы действительно хотите сделать, но давайте предположим, что проблема в том, что вы просто ищете правильный синтаксис:

public class ExampleClass<T> {
    public static <T> Class<T> method1(T x, ExampleClass<T> c) {
        return c.method3(x);
    }
    public static <T> T method2(ExampleClass<T> c) {
        return c.method2Dynamic();
    }
    private Class<T> method3(T x) {
        return null;
    }
    private T method2Dynamic() {
        return null;
    }
}
0 голосов
/ 23 сентября 2010

Если у вас есть обобщенный класс, вы не можете использовать параметры типа в статических методах, поскольку они там не имеют смысла.Например, рассмотрим ArrayList<T>.Вы можете создать ArrayList<String> stingList = new ArrayList<String>() и ArrayList<Integer> integerList = new ArrayList<Integer>.Так что теперь у вас есть экземпляры ArrayList, каждый со своим собственным типом параметра, и методы экземпляра, которые могут использовать преимущества этого типа параметра, такие как get.Но статические методы принадлежат классу, а не экземпляру, поэтому, когда вы вызываете статический метод, вы вызываете его как ArrayList.staticMethod() NOT stringList.staticMethod() или integerList.staticMethod() (вы также можете сделать это, но на самом деле это не имеет смысла,поскольку статический метод не может получить доступ к переменным экземпляра, он делает то же самое, что и вызов его в классе).Но когда вы вызываете его для класса, классом является просто ArrayList без каких-либо параметров типа, поскольку параметры типа используются только экземплярами.

Однако у вас могут быть методы, которые имеют собственный параметр типа, которыйнезависимо от параметра типа класса, как Томас показывает в своем ответе.Таким образом, вы можете затем вызвать этот метод как ExampleClass.<String> staticMethod();обратите внимание, что в ExampleClass здесь нет параметра типа, но у метода он есть.(вы можете опустить <String> в вызове метода, если компилятор может вывести его из использованных параметров, или тип возвращаемого значения: String s = ExampleClass.method2(new ExampleSubclass<String>()); обычно он делает довольно хорошую работу при выводе его)

0 голосов
/ 23 сентября 2010

См. Учебник по Java для получения справки по универсальным методам (в отличие от универсальных классов).

Исходя из вашего описания, вопрос о статическом методе и методе экземпляра здесь не должен вступать в игру.

...