Java используя это ключевое слово внутри потока, созданного внутри класса - PullRequest
0 голосов
/ 18 марта 2020

У меня есть такой код:

class MyClass{
    final ArrayList<Thread> list= new ArrayList<>();
    for(int i=0;i<N;i++)
        new Thread(()->{
            //more instructions...
            list.remove(this);
        }).start();

}

Вопрос касается предупреждения, показанного Intellij для инструкции list.remove(list);, говорящего мне: ArrayList<Thread> may not contains objects of type MyClass

Это неверный анализ по Intellij, или ключевое слово this в моем сценарии ссылается на включающий класс MyClass?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 18 марта 2020

this относится к экземпляру MyClass.

Это потому, что вы используете лямбда-выражение, которое само по себе не имеет контекста this.

Но даже если вы заменили лямбда-выражение анонимным подклассом, например:

new Thread(new Runnable() {
    public void run() {
        list.remove (this);
    }
})

Тогда this будет ссылаться на анонимный подкласс Runnable, а не на экземпляр Thread.

1 голос
/ 18 марта 2020

это ключевое слово ссылается на объект, который вызывает метод. В этом случае MyClass. Ваш список содержит темы. Ваш код пытается удалить этот объект (myclass) из списка, содержащего потоки.

Что не имеет смысла

0 голосов
/ 19 марта 2020

Спасибо за ваши указания, я нашел обходной путь, который соответствует моим потребностям, он может помочь некоторым другим пользователям:

class MyClass{
final ArrayList<Runnable> list= new ArrayList<>();
for(int i=0;i<N;i++)
    new Thread(new Runnable() {
    @Override
    public void run() {
        //more instructions...
        list.remove(this);
    }
}).start();

Я изменил список, чтобы он содержал Runnable объектов, затем this будет относиться к классу Runnable

(Кстати, я не понимаю, почему есть -2 голоса, по крайней мере, вы могли бы оставить свой комментарий, чтобы я понял, что является неправильным)

...