Статический метод в универсальном классе?

Ответ Исака у меня не сработал, потому что он не решил проблему того, как действовать, когда фактическое ожидание истекло для пользователя. Я закончил тем, что сделал это: каждый раз, когда я начинаю делать что-то длительное, я вызываю вспомогательный метод. Этот вспомогательный метод изменяет курсор, а затем создает DispatcherTimer, который будет вызываться, когда приложение бездействует. Когда он вызывается, он возвращает курсор мыши:

/// <summary>
///   Contains helper methods for UI, so far just one for showing a waitcursor
/// </summary>
public static class UiServices
{

     /// <summary>
     ///   A value indicating whether the UI is currently busy
     /// </summary>
     private static bool IsBusy;

     /// <summary>
     /// Sets the busystate as busy.
     /// </summary>
     public static void SetBusyState()
     {
          SetBusyState(true);
     }

     /// <summary>
     /// Sets the busystate to busy or not busy.
     /// </summary>
     /// <param name="busy">if set to <c>true</c> the application is now busy.</param>
     private static void SetBusyState(bool busy)
     {
          if (busy != IsBusy)
          {
               IsBusy = busy;
               Mouse.OverrideCursor = busy ? Cursors.Wait : null;

               if (IsBusy)
               {
                   new DispatcherTimer(TimeSpan.FromSeconds(0), DispatcherPriority.ApplicationIdle, dispatcherTimer_Tick, Application.Current.Dispatcher);
               }
          }
     }

     /// <summary>
     /// Handles the Tick event of the dispatcherTimer control.
     /// </summary>
     /// <param name="sender">The source of the event.</param>
     /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
     private static void dispatcherTimer_Tick(object sender, EventArgs e)
     {
          var dispatcherTimer = sender as DispatcherTimer;
          if (dispatcherTimer != null)
          {
              SetBusyState(false);
              dispatcherTimer.Stop();
          }
     }
}
189
задан André Chalella 1 June 2009 в 08:35
поделиться

4 ответа

Вы не можете использовать параметры универсального типа класса в статических методах или статических полях. Параметры типа класса находятся в области видимости только для методов экземпляра и полей экземпляра. Что касается статических полей и статических методов, они являются общими для всех экземпляров класса, даже экземпляров различных параметров типа, поэтому очевидно, что они не могут зависеть от конкретного параметра типа.

Не похоже, что ваша проблема требует использования параметр типа класса. Если вы опишете то, что вы пытаетесь сделать более подробно, возможно, мы поможем вам найти лучший способ сделать это.

258
ответ дан 23 November 2019 в 05:39
поделиться

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

Возможно, вы можете выполнить статические методы, вызвав Clazz .doit (что-то) , но похоже, что вы не можете.

Другой способ справиться с ситуацией - поместить параметр типа в сам метод:

static <U> void doIt(U object)

, что не дает вам правильного ограничения на U, но это лучше, чем ничего ....

137
ответ дан 23 November 2019 в 05:39
поделиться

Others have answered your question already, but in addition I can thoroughly recomment the O'Reilly Java Generics book. It's a subtle and complex subject at times, and if often seems to have pointless restrictions, but the book does a pretty good job of explaining why java generics are the way they are.

4
ответ дан 23 November 2019 в 05:39
поделиться

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

Универсальные шаблоны работают как шаблоны в C ++, поэтому вам следует сначала создать экземпляр своего класса, а затем использовать функцию с указанным типом.

2
ответ дан 23 November 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: