我知道.Net委托的许多用法可以通过使用接口和匿名类的组合在Java中进行模拟,但是在任何情况下委托都有真正的优势并且没有Java等价物吗?
是否可以将Unit转换为匿名类的方法?
代替:
addSelectionListener(new SelectionListener{
def widgetSelected(SelectionEvent event): Unit = {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
对此:
addSelectionListener toAnonymousClass(classOf[SelectionListener], {
/* .. */
})
Run Code Online (Sandbox Code Playgroud)
如果没有任何库可以做到这一点,我将如何制作一个?可能吗?
有人可以帮我理解这里的错误吗?我想我理解Scala中具有特征的匿名类构造.但是,当我尝试应用多个特征时,我得到一个错误,期待";" 或必要的声明结束.如果我也以这种方式声明一个类(具有需要匿名实现代码行的多个特性),同样的问题似乎也适用吗?Line Test 3在下面失败了.谢谢.
class TestTraits
trait A {def x:Int}
trait B {def y:Int}
object TestTraits {
def main(args: Array[String]): Unit = {
val test1 = new TestTraits with A {def x=22} //OK
val test2 = new TestTraits with B {def y=33} //OK
val test3 = new TestTraits with A {def x=22} with B {def y=33} //Errors: - ';' expected but 'with'
}
}
Run Code Online (Sandbox Code Playgroud) Java允许你在匿名类中声明新字段,但我无法弄清楚如何从外部访问它们,即使将它们设置为公共也不会让我.
class A {
public static void main(String[] args) {
Object o = new Object() {
public int x = 0;
{
System.out.println("x: " + x++);
System.out.println("x: " + x++);
}
};
System.out.println(o.x);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到这个编译器错误:
$ javac A.java && java A
A.java:10: cannot find symbol
symbol : variable x
location: class java.lang.Object
System.out.println(o.x);
^
1 error
Run Code Online (Sandbox Code Playgroud)
为什么?
我去搜索学习如何在Java中使用lambda表达式,但对我来说却出现了混乱.所以我对匿名类的理解是这样的:
public class SomeObject {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new SomeObject());
}
}
Run Code Online (Sandbox Code Playgroud)
我之前看过匿名内部类这个术语,但那个时候,我不知道普通的匿名类是什么.我看到很多线程和视频似乎只是将匿名内部类称为"匿名类".他们是同义词吗?我对匿名内部类的理解是:
public class Rectangle {
private double length;
private double width;
private double perimeter;
public void calculatePerimeter() {
perimeter = (2*length) +(2*width);
}
public static void main(String[] args) {
Rectangle square = new Rectangle() {
public void calculatePerimeter() {
perimeter = 4*length;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,不是必须为Square编写子类,然后重写calculatePerimeter()方法,我只能创建一次性方形类,并覆盖它们的方法.它是否正确?
因此,匿名内部类与继承有关.我不理解它的使用.也许,这是因为我之前从未使用过它们,或者因为我没有太多的编程经验.你可以给我一些例子或解释它什么时候有用吗?
更新:当我将匿名内部类的代码移动到IDE时,我了解到存在错误; 显然,"正方形"甚至没有继承矩形的字段.这不是没有用吗?
相当于:
public class Rectangle {
private double length;
private double …Run Code Online (Sandbox Code Playgroud) 嗨,我想知道这样的事情是否可能,我确定我的头衔问题不明确.
假设我有一个返回对象的JSON表示的函数.注意:这比任何不能纠正我功能的伪代码更多.
public static json function(object){
}
Run Code Online (Sandbox Code Playgroud)
是否可以定义这样的对象(我正在使用c#)
var exampleObject = { Name: "x" , PhoneNum: "123456789" }
Run Code Online (Sandbox Code Playgroud)
我希望有一种方法可以创建一个具有对象属性的对象,就像在运行时一样,而不必像以下那样创建类:
class exampleObject{
string name;
string phoneNum;
}
Run Code Online (Sandbox Code Playgroud)
这样的事情存在吗?谢谢.
我有一个要求,其中28个线程必须完成一些功能.我在匿名内部类中创建了这些线程,如:
Thread t=new Thread(new Runnable(){public void run()
{//code
}}
);
t.start();
Run Code Online (Sandbox Code Playgroud)
现在我希望在所有这些线程完成工作之后进一步执行.
注意:我对join()方法感到困惑,因为它使我的线程顺序运行.
所以任何人都可以建议我,一旦这些线程完成工作,我怎样才能使主线程运行.
我试图更好地理解Java中匿名类的概念.从本网站的其他答案中,我了解到匿名类可以使用包含类的非最终字段OuterClass.this.myField.
我使用接口创建了以下简单的测试用例AnonInt,以及AnonTest带有foo返回实现的匿名类实例的方法的类AnonInt.Dspite我正在使用System.out.println(a)而不是System.out.println(AnonTest.this.a)代码工作并打印正确的结果.怎么会这样?
public interface AnonInt {
void print();
}
public class AnonTest {
private int a;
public AnonTest(int a) {
this.a = a;
}
public AnonInt foo() {
return new AnonInt() {
public void print() {
System.out.println(a);
}
};
}
public static void main(String[] args) {
AnonTest at = new AnonTest(37);
AnonInt ai = at.foo();
ai.print();
}
}
Run Code Online (Sandbox Code Playgroud) 我很困惑,为什么x++;不允许在实例初始值设定项内增加尚未声明的字段(),但是如果包装到匿名类中,则允许在实例初始值设定项内进行递增(是的,匿名类可以访问类字段,但未初始化该字段! )。
class Test {
{ x++; } // ERR: Cannot reference a field before it is defined
Object anonFld = new Object() {
{ x++; } // fine! Sets x field below to 1 !
void f() {
x++; // fine!
}
};
int x;
// now x = 1 // anon constructor has set it!
}
Run Code Online (Sandbox Code Playgroud) 我发现了一个具有特征的有趣条件:
scala> trait Thing[A]
defined trait Thing
scala> val myThing: Thing[Int] = new Thing[Int]
error: trait Thing is abstract; cannot be instantiated
scala> val myThing: Thing[Int] = new Thing[Int] { }
myThing: Thing[Int] = $anon$1@135f160e
Run Code Online (Sandbox Code Playgroud)
为什么代码块允许我创建 Thing trait 的实例?
anonymous-class ×10
java ×6
scala ×3
.net ×1
anonymous ×1
c# ×1
closures ×1
constructor ×1
delegates ×1
field ×1
initializer ×1
json ×1
lambda ×1
traits ×1
visibility ×1