TGViewer
LikeaDuck🦆 LikeaDuck🦆 @likeaduck · 1.41K subscribers
Post #149 1.67K
Опять рубрика "Баг или Фича" в IDEA:

1) Имеем JUnit Extension, который кладет в context List<CategoryJson> :
final List<CategoryJson> result = new ArrayList<>();
context.getStore(NAMESPACE).put(
context.getUniqueId(),
result
);


2) Имеем желание прокинуть этот List<T> через ParameterResolver в виде массива в аргументы теста:
  @Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.getParameter().getType().isAssignableFrom(CategoryJson[].class);
}

@Override
@SuppressWarnings("unchecked")
public CategoryJson[] resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);
}


3) А теперь самое интересное 🙂 Этот код - работает, но IDEA его подсвечивает: Can be replaced with Collection.toArray(). Соглашаемся, и наш метод resolveParameter принимает вид:


1️⃣было :
    return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class)
.stream()
.toArray(CategoryJson[]::new);

2️⃣стало :
return (CategoryJson[]) extensionContext.getStore(NAMESPACE).get(extensionContext.getUniqueId(), List.class).toArray();


И тест с таким кодом не запускается, мы имеем ошибку:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [...model.CategoryJson; ([Ljava.lang.Object; is in module java.base of loader 'bootstrap'; [...model.CategoryJson; is in unnamed module of loader 'app')


C точки зрения моего понимания - все ок, мы действительно потеряли Method Reference CategoryJson[]::new и теперь наш массив имеет тип Object[] (хотя под капотом там на самом деле CategoryJson[] 🥲), но, потеряли-то мы его просто согласившись через ALT + ENTER с подсказкой IDEA. При этом весь контекст (в виде type casting), казалось бы, есть - ну убери просто лишний stream(), зачем убирать CategoryJson[]::new ?
  • 🤔 2
  • ❤ 1
More from @likeaduck
  1. May 31, 2026Последние три дня связаны с конференцией Codefest'16 - для меня это была крайне редкая кон…
  2. May 12, 2026В семье все заболели. После конференции сказался, видимо, недосып и усталость, иммунитет о…
  3. Apr 29, 2026Любопытный факт: Оказалось, я на втором месте по числу выступлений на Heisenbug за все вре…
  4. Apr 22, 2026Неделя в Москве - тимбилдинг со своими командами (на фото героическая QA-core команда, кот…
  5. Apr 21, 2026Впервые за год в TG написал рекрутер, спросил интересно ли обсудить позицию руководителя к…
  6. Mar 17, 2026Кстати fun fact о накрутке опыта: В QA.GURU мне дали посмотреть резюме (оценить и, возможн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →