Почему я не могу явно передать аргумент типа универсальному методу Java?

$innerListItem.position().top фактически относится к .scrollTop() его первого позиционированного предка. Таким образом, способ вычисления правильного значения $parentDiv.scrollTop() заключается в том, чтобы убедиться, что $parentDiv установлен. Если он еще не имеет явного position, используйте position: relative. Элементы $innerListItem и все его предки до $parentDiv не должны иметь явной позиции. Теперь вы можете перейти к $innerListItem с помощью:

// Scroll to the top
$parentDiv.scrollTop($parentDiv.scrollTop() + $innerListItem.position().top);

// Scroll to the center
$parentDiv.scrollTop($parentDiv.scrollTop() + $innerListItem.position().top
    - $parentDiv.height()/2 + $innerListItem.height()/2);
24
задан Michael Schmidt 5 July 2013 в 08:58
поделиться

4 ответа

Когда компилятор Java не может вывести тип параметра отдельно для статического метода, можно всегда передавать его с помощью полного квалифицированного имени метода: Класс. < Введите> метод ();

Object list = Collections.<String> emptyList();
36
ответ дан 28 November 2019 в 22:43
поделиться

Вы можете, если Вы передаете в типе как параметр метода.

static <T> List<T> createEmptyList( Class<T> type ) {
  return new ArrayList<T>();
}

@Test
public void createStringList() {
  List<String> stringList = createEmptyList( String.class );
}

Методы не могут быть genericised таким же образом, что тип может, таким образом, единственная опция для метода с универсальным типом возврата с динамическим контролем типов - уф это - полный рот:-) - должен передать в типе как аргумент.

Для действительно превосходного FAQ на дженериках Java, посмотрите дженерики FAQ Angelika Langer.

.
.

Продолжение:

не имело бы смысла в этом контексте использовать аргумент Array в качестве в Collection.toArray( T[] ). Единственная причина массив используется, состоит в том, потому что тот же (предварительно выделенный) массив используется для содержания результатов (если массив является достаточно большим для установки им всем в). Это экономит на выделении нового массива во времени выполнения все время.

Однако в целях образования, если Вы действительно хотели использовать ввод массива, синтаксис очень похож:

static <T> List<T> createEmptyList( T[] array ) {
  return new ArrayList<T>();
}

@Test
public void testThing() {
  List<Integer> integerList = createEmptyList( new Integer[ 1 ] );
}
25
ответ дан Cheekysoft 28 November 2019 в 22:43
поделиться

Это было некоторое время, так как я вырыл в те части Java, но...

то, Почему Вы не можете сделать этого, было, вероятно, проектным решением разработчиками языка. Однако, из-за стирание типа используемый Java, информация о дженериках отбрасывается во время компиляции так или иначе, таким образом, в Вашем примере это создало бы точно тот же код байта, был ли у Вас параметр типа или нет.

1
ответ дан Henrik Gustafsson 28 November 2019 в 22:43
поделиться

@pauldoo Да, Вы совершенно правы. Это - одни из слабых мест с дженериками Java, по моему скромному мнению.

я ответ на Cheekysoft я хотел бы предложить также посмотреть на то, как это сделано самими людьми Java, такими как T [] AbstractCollection#toArray (T [] a). Я думаю, что версия Cheekysofts выше, но Java каждый имеет преимущество знакомства.

Редактирование: Добавленная ссылка. Переиздайте: Найденный ошибкой на ТАК:)

<час>

Продолжение на Cheekysoft: Ну, поскольку это - список некоторого типа, который должен быть возвращен, соответствующий пример должен посмотреть что-то как:

static <T> List<T> createEmptyList( List<T> a ) {
  return new ArrayList<T>();
}

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

0
ответ дан Henrik Gustafsson 28 November 2019 в 22:43
поделиться
Другие вопросы по тегам:

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