标签: anonymous-class

这个构造函数调用以下双括号是什么?

不幸的是,我没有编写Java大约五年,我完全不记得下面的代码如何或为什么工作.

我偶然发现了一个类似的例子并将其分解为此.重点是注释下面的部分:我没有得到构造函数符号,后面是双括号中的块.不幸的是,我无法在Java文档中找到任何内容或使用Google(我应该使用哪些词?).

package syntaxtest;

public class Main {

    public static void main(String[] args) {

        // What kind of notation is this?
        MyTest tester = new MyTest() {{
            setName("John Johnson");
        }};

        System.out.println(tester.getName());
    }
}


class MyTest {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以这是我的问题:

  1. 如何调用这种符号/语法?
  2. 我在哪里可以阅读一些有关它的文档?

我想/希望如果有人能够为我提供第一个问题的答案,我将能够自己回答第二个问题.

说清楚:我知道输出是John Johnson;)但我不知道它为什么有效.

java syntax constructor anonymous-class

15
推荐指数
2
解决办法
4024
查看次数

Kotlin对象表达式:比较器示例

此代码基本上按降序对数组进行排序:

val arrayList = arrayListOf(1, 5, 2)

Collections.sort(arrayList, object : Comparator<Int> {
   override fun compare(x : Int, y: Int) = y - x
})
Run Code Online (Sandbox Code Playgroud)

世界上如何将比较方法与y - x作品重叠?科特林怎么知道是什么y - x意思把y之前x如果y < x

java anonymous-class comparator kotlin

15
推荐指数
2
解决办法
2万
查看次数

匿名类实现接口

我在方法中有以下代码:

 var list = new[]
  {
   new { Name = "Red", IsSelected = true },
   new { Name = "Green", IsSelected = false },
   new { Name = "Blue", IsSelected = false },
  };
Run Code Online (Sandbox Code Playgroud)

我想调用一个函数,它需要一个元素列表,每个元素实现一个接口(ISelectable).我知道如何使用普通类完成此操作,但在这种情况下,我只是尝试填写一些演示数据.

是否可以创建实现接口的匿名类?

像这样:

new { Name = "Red", IsSelected = true } : ISelectable
Run Code Online (Sandbox Code Playgroud)

c# interface anonymous-class

14
推荐指数
2
解决办法
4890
查看次数

特征类的typedef中的匿名结构

抱歉有趣的标题.

在此之前的C++ 0x,有限制的使用功能局部结构("本地型")作为模板参数.我的问题基本上是否类似的限制适用于匿名结构.具体来说,在特质类的上下文中:

template <typename T>
struct trait;

template <>
struct trait<int> {
    typedef int type;
};

template <typename T>
struct trait<std::basic_string<T> > {
    typedef struct {
        T value;
    } type;
};

trait<std::string>::type foo; // Is this valid?

template <typename T>
void f() { }

f<trait<std::string>::type> >(); // Is this?

template <typename T>
void g() { f<typename trait<T>::type>(); }

g<std::string>(); // And this?
Run Code Online (Sandbox Code Playgroud)

这有效可靠吗?它汇编了最新版本的GCC和LLVM,但我仍然不安全,这是否严格有效,以及VC++和ICC是否理解它.

c++ templates anonymous-class c++11

14
推荐指数
2
解决办法
984
查看次数

我什么时候需要C++中的匿名类?

在C++中有一个叫做匿名类的功能.它与C中的匿名结构类似.我认为这个功能是由于某些需求而发明的,但我无法弄清楚它是什么.

我可以有一些真正需要匿名课程的例子吗?

c++ anonymous-class

14
推荐指数
1
解决办法
1万
查看次数

当从实例方法返回一个没有引用其封闭类的匿名类时,它会引用它.为什么?

当从实例方法返回没有引用其封闭类的匿名类时,它会引用this.为什么?

请考虑以下代码:

package so;

import java.lang.reflect.Field;

public class SOExample {

    private static Object getAnonymousClassFromStaticContext() {
        return new Object() {
        };
    }

    private Object getAnonymousClassFromInstanceContext() {
        return new Object() {
        };
    }

    public static void main(String[] args) throws NoSuchFieldException, SecurityException {

        Object anonymousClassFromStaticContext = getAnonymousClassFromStaticContext();
        Object anonymousClassFromInstanceContext = new SOExample().getAnonymousClassFromInstanceContext();

        Field[] fieldsFromAnonymousClassFromStaticContext = anonymousClassFromStaticContext.getClass().getDeclaredFields();
        Field[] fieldsFromAnonymousClassFromInstanceContext = anonymousClassFromInstanceContext.getClass().getDeclaredFields();

        System.out.println("Number of fields static context: " + fieldsFromAnonymousClassFromStaticContext.length);
        System.out.println("Number of fields instance context: " + fieldsFromAnonymousClassFromInstanceContext.length);
        System.out.println("Field from instance context: " …
Run Code Online (Sandbox Code Playgroud)

java anonymous-class

14
推荐指数
1
解决办法
1226
查看次数

为什么在Java中的匿名类中添加公共字段不起作用?

我有一个如下定义的示例类:

public class FooBar {

  void method1(Foo foo){ // Should be overwritten
    ...
  }

}
Run Code Online (Sandbox Code Playgroud)

后来,当我尝试这个:

FooBar fooBar = new FooBar(){
  public String name = null;
  @Override
  void method1(Foo foo){
    ...
  }
};

fooBar.name = "Test";
Run Code Online (Sandbox Code Playgroud)

我收到一个错误,说明名称字段不存在.为什么?

java anonymous-class

13
推荐指数
2
解决办法
3628
查看次数

为什么静态上下文中的匿名类有效

我对Java中的匿名类有什么误解.考虑以下简单示例:

public static void main (String[] args) throws java.lang.Exception
{
    B b = new B(){ };
    System.out.println(b.b);
}

interface B{ int b = 1; }
Run Code Online (Sandbox Code Playgroud)

DEMO

为什么代码编译?在JLS,CHAPT 15说:

匿名类始终是内部类(第8.1.3节); 它永远不会是静止的

JLS,8章

内部类是未显式或隐式声明为静态的嵌套类.

所以匿名类是一个内部类.但我们在静态环境中使用它们.为什么在这里是正确的?

java anonymous-class

13
推荐指数
1
解决办法
1082
查看次数

为什么匿名类可以访问封闭类的非final类成员

我们知道只能在匿名类中访问最终的局部变量,这里有一个很好的理由:为什么在匿名类中只能访问最终变量?.

但是,我发现如果变量是封闭类的成员字段,匿名类仍然可以访问非final变量:如何从匿名类内部访问封闭的类实例变量?

我很迷惑.我们确保只能在匿名类中访问最终的局部变量,因为我们不希望变量在匿名类和本地函数之间不同步.如果我们尝试访问匿名类中的非最终封闭类成员,则同样的理由应该适用于该情况.

为什么不关注呢?

java closures final anonymous-class

13
推荐指数
1
解决办法
1543
查看次数

最终参数在哪里存储在匿名类实例中?

我有以下静态工厂方法,从int数组创建列表视图:

public static List<Integer> newInstance(final int[] numbers) {
    return new AbstractList<Integer>() {

        @Override
        public Integer get(int index) {
            return numbers[index];
        }

        @Override
        public int size() {
            return numbers.length;
        }
    };
}


public static void main(String[] args) {
    int[] sequence = {10, 20, 30};
    List<Integer> list = ListFactory.newInstance(sequence);
    System.out.println("List is "+list);

}
Run Code Online (Sandbox Code Playgroud)

在"Effective Java"中,Joshua Bloch提到了这一点

作为适配器,允许将int数组视为Integer实例列表.

但是,我记得Adapter使用组合,匿名列表实现的实例应该使用int []作为成员字段.

如果int []输入参数不是匿名列表实现的成员字段,那么它究竟存储在哪里?

如果有人能提供一些见解或一些链接来寻找更多信息,我将不胜感激.

java parameters final adapter anonymous-class

13
推荐指数
1
解决办法
209
查看次数