我是java的新手如果这是一个非常简单的问题,请耐心等待,但我很好奇这个带有{code}的方法调用 - 请参阅下面的代码,以获取方法addSelectionListener中的示例.这样做的目的是什么?我一直在通过文档寻找解释,但似乎无法找到这种做法被称为从不介意任何有用的信息.
setStatusLine.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
String message = "I would like to say hello to you.";
if (pressed) {
message = "Thank you for using me";
}
setStatusLine(message);
pressed = !pressed;
}
});
Run Code Online (Sandbox Code Playgroud)
感谢您提供的任何帮助或见解
根据StringComparer.OrdinalIgnoreCase属性的MSDN文档:
OrdinalIgnoreCase属性实际上返回从StringComparer类派生的匿名类的实例.
这是一个我不熟悉的功能 - 带继承的匿名类型吗?或者通过"匿名类",作者只是意味着"内部类派生自StringComparer客户端代码不可见"?
您可能知道,有些人使用Enum of 1实例声明单例,因为JVM保证总是会有一个没有并发问题的实例来处理...
那么具有多个实例的枚举呢?我们可以说像Enum这样的东西是一种有序的单身人士共享一个共同的界面吗?为什么?
public enum EnumPriceType {
WITH_TAXES {
@Override
public float getPrice(float input) {
return input*1.20f;
}
public String getFormattedPrice(float input) {
return input*1.20f + " €";
}
},
WITHOUT_TAXES {
@Override
public float getPrice(float input) {
return input;
}
},
;
public abstract float getPrice(float input);
public static void main(String[] args) {
WITH_TAXES.getFormattedPrice(33f);
}
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,为什么这不起作用:WITH_TAXES.getFormattedPrice(33f); 如果不通过公共接口无法调用公共方法,那么声明公共方法的兴趣是什么?我想这就是为什么我没有看到任何语法能够为Enum的一个实例声明一个接口.
编辑:
似乎枚举实例是一种特殊的匿名类.因此,我理解为什么你不能称之为该方法.
我的问题有点与:为什么匿名类不能实现一个接口(除了它可能已经实现的接口!)
我完全理解为什么我们不能这样做:
Vehicle veh = new Vehicle() {
public String getName() {
return "toto";
}
}; …Run Code Online (Sandbox Code Playgroud) 你有什么理由不能将匿名类序列化为Json吗?
例:
public class AnonymousTest
{
private Gson gson = new Gson();
public void goWild()
{
this.callBack(new Result()
{
public void loginResult(Result loginAttempt)
{
// Output null
System.out.println(this.gson.toJson(result));
}
});
}
public void callBack(Result result)
{
// Output null
System.out.println(this.gson.toJson(result));
result.loginResult(result);
}
public static void main(String[] args)
{
new AnonymousTest().goWild();
}
}
Run Code Online (Sandbox Code Playgroud)
刚开始吧:)
请检查下面的Java代码:
public class Test
{
public static void main(String arg[]) throws Throwable
{
Test t = new Test();
System.out.println(t.meth().s); //OP: Old value
System.out.println(t.meth().getVal()); //OP: String Implementation
}
private TestInter meth()
{
return new TestInter()
{
public String s = "String Implementation";
public String getVal()
{
return this.s;
}
};
}
}
interface TestInter
{
String s = "Old value";
String getVal();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我已匿名创建了一个界面.当我直接访问界面变量时,它将显示"旧值".
t.meth().s =>"旧价值"
通过getVal()方法访问它会返回正确的值,
t.meth().getVal()=>"字符串实现"
我不明白这段代码是如何工作的,有人可以向我解释一下吗?
注意:这是一个自我回答的问题.这可能是一个非常简单的,但我认为值得分享.
假设我有一个匿名类声明:
MyObject myObj1 = new MyObject() {
};
Run Code Online (Sandbox Code Playgroud)
在哪里MyObject:
class MyObject {
public MyObject() { // explicit public constructor
}
...
}
Run Code Online (Sandbox Code Playgroud)
从Java语言规范的这一部分(强调我的):
匿名类不能具有显式声明的构造函数.相反,匿名构造函数是为匿名类隐式声明的.
如果我试图获得public构造函数的数量:
// Number of public constructors; prints 0
System.out.println(myObj1.getClass().getConstructors().length);
Run Code Online (Sandbox Code Playgroud)
它按预期打印零,即匿名构造函数不是public.
它也不是private,因为如果我们从定义匿名类的同一个包中的不同类调用以下内容(通过传递实例myObj1):
myObj1.getClass().getDeclaredConstructor().newInstance();
Run Code Online (Sandbox Code Playgroud)
它完成没有的IllegalAccessException.
匿名类中隐式构造函数的访问修饰符是什么?
从PHP7开始,我们有匿名类.
我们怎么知道an $instance是一个匿名类的实例?
以下java代码工作正常.
public static void main(String[] arg){
JPanel p = (new JPanel());
p.add( new Object(){
JButton f(JButton x){
x.setEnabled(false);
return x;
}}.f(new JButton("B")) );
JFrame w = new JFrame("W");
w.add(p);
w.pack();
w.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
如果该方法更改为其通用形式,则程序将失败.
public static void main(String[] arg){
JPanel p = (new JPanel());
p.add( new Object(){
<T> T f(T x){
x.setEnabled(false);
return x;
}}.f(new JButton("B")) );
JFrame w = new JFrame("W");
w.add(p);
w.pack();
w.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
为什么会失败?如何在匿名类中定义泛型方法?
这个问题是出于学习目的.
我在使用Optionals 和匿名类时遇到了一个奇怪的问题:
public class Foo {
interface Bar {
}
void doesNotCompile() {
Optional.of(new Bar() {
}).orElse(new Bar() {
});
}
void doesNotCompile2() {
final Bar bar = new Bar() {
};
Optional.of(new Bar() {
}).orElse(bar);
}
void compiles1() {
final Bar bar = new Bar() {
};
Optional.of(bar).orElse(new Bar() {
});
}
}
Run Code Online (Sandbox Code Playgroud)
前两种方法不编译会报错
java: incompatible types: <anonymous test.Foo.Bar> cannot be converted to <anonymous test.Foo.Bar>
Run Code Online (Sandbox Code Playgroud)
我预料到了,因为这两种Bar方法都实现了接口,所以这三种方法都可以工作。我也无法弄清楚为什么第三个选项解决了这个问题。任何人都可以解释一下吗?
如果我有一个将单方法接口作为参数的方法,我可以这样调用它:
foo(new Bar() {
@Override
public String baz(String qux) {
return modify(qux) + transmogrify(qux);
}
}
Run Code Online (Sandbox Code Playgroud)
但是如果我必须foo在一个紧密循环中调用数百万次,我可能更愿意避免每次通过循环创建匿名类的新实例:
final Bar bar = new Bar() {
@Override
public String baz(String qux) {
return modify(qux) + transmogrify(qux);
}
};
while (...) {
foo(bar);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我用 lambda 表达式替换匿名类:
while (...) {
foo(qux -> modify(qux) + transmogrify(qux));
}
Run Code Online (Sandbox Code Playgroud)
这个 lambda 表达式是否等同于上述匿名类示例中的第一个或第二个片段?