Попробуйте это:
df1 %>%
group_by(cat, cl) %>%
do(ids=paste( inner_join(.,df2) %>%
dplyr::pull(id), collapse=';'))
Не совсем точно, почему это работает, но это так.
Нет, вы не можете, и нет, компилятор не может понять это. Вот почему FindBugs всегда предлагает изменить анонимные внутренние классы на именованные статические
вложенные классы, если они не используют свою неявную эту
ссылку.
Редактировать: Tom Hawtin - tackline говорит, что если анонимный класс создается в статическом контексте (например, в методе main
), анонимный класс фактически является статическим
. Но JLS не согласен :
Анонимный класс никогда не является
абстрактным
(§8.1.1.1). Анонимный класс всегда является внутренним классом (§8.1.3); оно никогда нестатично
(§8.1.1, §8.5.1). Анонимный класс всегда неявноfinal
(§8.1.1.2).
Roedy Green ' Глоссарий Java говорит, что факт, что анонимные классы разрешены в статическом контексте, зависит от реализации:
Если вы хотите сбить с толку тех, кто поддерживает ваш код, wags обнаружили
javac.exe
разрешит анонимные классы внутристатического
кода инициализации истатического
метода, даже если спецификация языка говорит, что анонимные классы никогда не являютсястатическими
. Эти анонимные классы, конечно, не имеют доступа к полям экземпляра объекта. Я не рекомендую делать это. Функция может быть удалена в любое время.
Редактировать 2: JLS на самом деле более четко охватывает статические контексты в §15.9.2 :
Пусть C будет классом, для которого создается экземпляр, и пусть ] i будет создаваемым экземпляром. Если C является внутренним классом, то i может иметь непосредственно включающий экземпляр. Непосредственно включающий экземпляр i (§8.1.3) определяется следующим образом.
- Если C является анонимным классом, то:
- Если выражение создания экземпляра класса происходит в статическом контексте (§8.1.3), то i не имеет немедленно включающего экземпляра.
- В противном случае немедленно включающий экземпляр i является
этим
.
Таким образом, анонимный класс в статическом контексте примерно эквивалентен вложенному статическому
класс в том смысле, что он не хранит ссылку на включающий класс, хотя технически он не является статическим
классом.
Внутренние классы не могут быть статическими - статический вложенный класс не является внутренним классом. Об этом здесь рассказывается в руководстве по Java .
Я думаю, что здесь есть небольшая путаница в номенклатуре, которая, по общему признанию, слишком глупа и сбивает с толку.
как вы их называете, эти шаблоны (и несколько вариантов с разной видимостью) являются всеми возможными, нормальными, легальными Java:
public class MyClass {
class MyClassInside {
}
}
public class MyClass {
public static class MyClassInside {
}
}
public class MyClass {
public void method() {
JComponent jc = new JComponent() {
...
}
}
}
public class MyClass {
public static void myStaticMethod() {
JComponent jc = new JComponent() {
...
}
}
}
Они учтены в спецификации языка (если вы действительно обеспокоены, см. раздел 15.9). 5.1 для одного внутри статического метода).
Но эта цитата просто неверна :
javac.exe разрешит анонимный доступ классы внутри статического кода инициализации и статические методы, хотя спецификация языка говорит чем аноним классы никогда не бывают статическими
Я думаю, что цитируемый автор путает ключевое слово static со статическим контекстом . (Следует признать, что JLS также немного сбивает с толку в этом отношении.)
Честно говоря, все вышеприведенные шаблоны хороши (как бы вы их ни называли «вложенными», «внутренними», «анонимными», как угодно ...). Действительно, никто не собирается внезапно удалять эту функциональность в следующем выпуске Java. Честно!
Вид. Анонимный внутренний класс, созданный в статическом методе, очевидно, будет эффективно статическим, потому что нет никакого внешнего источника для внешнего.
Есть некоторые технические различия между внутренними классами в статических контекстах и статическими вложенными классами. Если вам интересно, прочитайте JLS 3rd Ed.