标签: anonymous-inner-class

从内部匿名类访问外部匿名类的字段

要从内部类B访问外部类A的字段x,我意识到您可以使用"A.this.x".但是,如果外层阶级也是匿名的呢?例如,

public class Main1 {
    public static void main(String[] args) {
        Comparable c1 = new Comparable(){
            int x = 3;
            public int compareTo(Object o) {
                Comparable c2 = new Comparable(){
                    int x = 4;
                    public int compareTo(Object o) {
                        return x;  // <-- THIS LINE
                    }
                };
                return c2.compareTo(o);
            }
        };
        System.out.println(c1.compareTo(null));
    }
}
Run Code Online (Sandbox Code Playgroud)

运行此代码时,将打印值4,因为这是c2的字段x的值.但是,我想更改标记为"THIS LINE"的行,以便返回外部类的x(即c1的字段x,值为3).如果外部类(即c1的类)是一个命名的类A,那么我可以替换

return x;
Run Code Online (Sandbox Code Playgroud)

return A.this.x;
Run Code Online (Sandbox Code Playgroud)

但由于外层也是匿名的,我没有名字可以使用.

问题:有没有办法修改标记为"THIS LINE"的行,使其引用c1的字段x而不是c2,而不将匿名类更改为命名类?

我意识到这段代码非常难看,以这种方式使用匿名类是不好的编程风格,但代码是由另一个程序生成的,这是实现生成器的最简单方法.

java anonymous-inner-class

5
推荐指数
1
解决办法
2101
查看次数

是否有一种语法可以从另一个匿名内部类中获取对匿名内部类的引用?

考虑这种情况:

public class SomeClass {
    public void someMethod() {
        new SomeInterface() {
              public void someOtherMethod() {
                  new SomeOtherInterface() {
                       new someThirdMethod() {
                            //My question is about code located here.
                       }
                  };
              }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有语法引用注释代码中SomeInterface表示的匿名内部类的实例?对于SomeClass,你可以做到SomeClass.this是否有相应的获得SomeInterface的实现?

如果没有,当然你可以在SomeInterface实现中定义一个最终的局部变量并引用它,但我只是想知道是否实际上有直接语言支持来引用该实例.

java syntax anonymous-inner-class

5
推荐指数
1
解决办法
336
查看次数

如何将非final变量传递给匿名内部类?

我有这些代码行.我知道你不能将非final变量传递给内部类,但我需要将变量传递i给匿名内部类以用作seatID.你能建议这样做的方法吗?

JButton [] seats = new JButton [40]; //creating a pointer to the buttonsArray
for (int i = 0; i < 40; i++)
{
    seats[i] = new JButton();//creating the buttons
    seats[i].setPreferredSize(new Dimension(50,25));//button width
    panel4seating.add(seats[i]);//adding the buttons to the panels

    seats[i].addActionListener(new ActionListener()
    {  //anonymous inner class
        public void actionPerformed(ActionEvent evt)
        {  
            String firstName = (String)JOptionPane.showInputDialog("Enter First Name");
            String lastName = (String)JOptionPane.showInputDialog("Enter Last Name");

            sw101.AddPassenger(firstName, lastName, seatingID);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

java anonymous-inner-class inner-classes

5
推荐指数
1
解决办法
4473
查看次数

我是否需要取消注册"匿名"BroadcastReceiver

我最近问了一个关于检查发送短信状态的问题,给出的答案是一个代码片段,注册了两个"匿名内部"(如果不正确,请更正我的术语)BroadcastReceivers来收听短信发送/传送的广播.这些接收器只需要接收有关我的应用程序刚刚发送的SMS的数据,因此不需要永久收听.

我的直接想法是"好吧,我完成后我需要取消注册",但这是正确的吗?我问海报,因为他没有包含任何未注册的代码,但没有得到回复.代码似乎是一种非常标准的方式来做我想要的,因为它出现在许多Android开发网站上.这里是:

//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{        
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
        new Intent(SENT), 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
        new Intent(DELIVERED), 0);

    //---when the SMS has been sent---
    registerReceiver(new BroadcastReceiver(){
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode())
            {
                case Activity.RESULT_OK:
                    Toast.makeText(getBaseContext(), "SMS sent", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    Toast.makeText(getBaseContext(), "Generic failure", 
                            Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    Toast.makeText(getBaseContext(), "No service", …
Run Code Online (Sandbox Code Playgroud)

sms android anonymous-inner-class broadcastreceiver

5
推荐指数
1
解决办法
2090
查看次数

Java - 从lambda中更改最终变量的值

在Java中,我有以下代码

List<Integer> myList = new ArrayList<>();
for (int i=0;i<9;i++) {
    myList.add(i);
}

Integer sum = 0;

myList.forEach(i -> {
    sum = sum + i; // does not compile, sum needs to be final or effectively final
});   

for(int i : myList) {
    sum = sum + i; //runs without problems
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是,为什么我不能在lambda中改变sum的值?它与下面的for循环完全相同,或者我错了?有趣的是,如果我将main方法之外的整数和声明为静态,它也可以.谁能解释我为什么?

编辑:在另一个类似的问题Java 8支持闭包,答案似乎是:

它是向后兼容性和项目资源约束的组合.

但是,我仍然无法理解为什么它可以工作,如果我将数组和数组或我在main之外声明它.我还想了解下面的myList.forEach和for循环之间有什么区别,为什么一个有效,另一个没有.

java foreach lambda anonymous-inner-class

5
推荐指数
1
解决办法
5552
查看次数

静态方法中的匿名类,持有什么参考?

Afaik,在Java中,匿名内部类总是拥有对其外部类的封闭实例的引用.现在当我在静态方法中放入一个匿名类时会发生什么?由于它的外部类没有对象,它是否包含对调用静态方法的类的引用?我在这里有点困惑.考虑下面的Android示例(使用parse.com框架):

public class OnlineQuery {    
    public static void queryUsers(final ListenerInterface listener) {
        ParseQuery<ParseUser> query = User.getQuery();
        query.findInBackground(new FindCallback<ParseUser>() {
            @Override
            public void done(final List<ParseUser> userList, ParseException e) {
            listener.reportBackToCallingActivity();    
            // to which class is as a reference held here?
            }
        });
    }
}

public class MainActivity extends Activity implements OnlineQuery.ListenerInterface {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OnlineQuery.queryUsers(this)
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

另外,正在使用一个监听器,如示例中关于内存泄漏的错误做法所示?谢谢!

java android static-methods memory-leaks anonymous-inner-class

5
推荐指数
1
解决办法
552
查看次数

不存在的隐藏Java内部类的奥秘

我正在为学校制作一个成绩单项目,它正在编译好像有一个匿名的内部课程,但我没有写过任何内容.为什么javac在没有编写任何内部类(包括枚举或异常)的情况下编译内部类?有问题的文件是SemesterInfo $ 1.class,由SemesterInfo.java编译.我见过类似的问题,其中实际上有内部类,但这里没有.我从Java库中抛出一个异常(UnsupportedOperationException),但它已经在库中定义(java.lang.UnsupportedOperationException),因此不是匿名的或内部类.我的目录如下:

02/20/2016  02:03 PM               915 AddResult.class
02/15/2016  09:16 PM               848 AddResult.java
02/20/2016  02:03 PM             1,032 Console.class
02/05/2016  08:27 AM             1,315 Console.java
02/20/2016  02:03 PM             1,624 CourseInfo.class
02/19/2016  10:56 AM             9,203 CourseInfo.java
02/20/2016  02:03 PM             2,244 CourseInfoTester.class
02/17/2016  05:15 PM             2,226 CourseInfoTester.java
01/22/2016  10:55 AM             3,769 Keyboard.class
02/20/2016  02:03 PM               686 SemesterInfo$1.class
02/20/2016  02:03 PM             6,810 SemesterInfo.class
02/20/2016  01:57 PM            36,263 SemesterInfo.java
02/20/2016  02:03 PM             1,350 SemesterInfoTester.class
02/17/2016  11:59 PM             1,050 SemesterInfoTester.java
Run Code Online (Sandbox Code Playgroud)

SemesterInfo.java

import java.util.Scanner;

public class …
Run Code Online (Sandbox Code Playgroud)

java anonymous-inner-class javac

5
推荐指数
1
解决办法
165
查看次数

在Java中如何从内部引用匿名内部类?

我正在定义一个回调,并希望从内部引用回调.编译器不喜欢这样,并声称引用回调的变量未初始化.这是代码:

final Runnable callback = new Runnable() {
    public void run() {
        if (someCondition()) {
            doStuffWith(callback); // <<--- compiler says "the local variable callback may not be initialized"
        }
    }
};
// Here callback is defined, and is certainly defined later after I actually do something with callback!
Run Code Online (Sandbox Code Playgroud)

很明显,编译器被误认为是在我们到达内部方法的时候定义了回调.如何告诉编译器这段代码没问题,或者我怎么能用不同的方式编写它来安抚编译器呢?我没有做太多Java,所以我可能会在这里咆哮错误的树.有没有其他惯用的方法来做到这一点?对我来说,这似乎是一个非常简单的构造.

编辑:当然,这个,太容易了.感谢所有快速解答!

java anonymous-inner-class callback runnable

4
推荐指数
1
解决办法
978
查看次数

使用额外的接口实现在Java中实例化匿名内部类

假设我有以下两个类/接口定义:

public abstract class FooClass {
    public abstract void doFoo();
}
Run Code Online (Sandbox Code Playgroud)

public interface BarInterface {
    public void doBar();
}
Run Code Online (Sandbox Code Playgroud)

如果我想创建一个扩展/实现两者的匿名内部类,我是否需要这样做:

public abstract class BothClass extends FooClass implements BarInterface {}

...

new BothClass() {
    public void doFoo() {
        System.out.println("Fooooooooo!!!!");
    }

    public void doBar() {
        System.out.println("Baaaaaaaar!!!!");
    }
}.doBar();
Run Code Online (Sandbox Code Playgroud)

或者是否有一个允许我不定义的捷径BothClass?这样的事情,也许:

new (FooClass implements BarInterface)() {
    public void doFoo() {
        System.out.println("Fooooooooo!!!!");
    }

    public void doBar() {
        System.out.println("Baaaaaaaar!!!!");
    }
}.doBar();
Run Code Online (Sandbox Code Playgroud)

(这个想法给了我几个错误,这些都没有帮助)

java anonymous-inner-class subclassing interface-implementation

4
推荐指数
1
解决办法
529
查看次数

构建一个匿名内部类并调用其方法

我搜索了这个,但遗憾的是找不到匹配,我在这样local anonymous inner class的方法中有这个: -

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
};
Run Code Online (Sandbox Code Playgroud)

2 methods里面(open,dis),我知道,如果我想使用他们中的任何一个,那就做

new Object(){
    public void open(){
        // do some stuff
    }
    public void dis(){
        // do some stuff
    }
}.open()
Run Code Online (Sandbox Code Playgroud)

现在我的问题是如果我想同时调用这两种方法怎么办我该怎么

java anonymous-inner-class

4
推荐指数
1
解决办法
161
查看次数