我希望能够在对象运行初始化程序之前在运行时实现一个方法.这将允许我设置初始化期间使用的字段.
这是一个例子:
class A {
public A() {
initialize();
}
public void initialize() { }
}
class B extends A {
public String message;
{
System.out.println(message);
}
}
public class MainClass {
public static void main(final String[] args) throws Exception {
Class<A> aClass = (Class<A>)Class.forName(args[0]);
// what's next in order to something like this even though
// I don't know what subclass of A was passed in as an
// argument above
A a = aClass.newInstance()
{
public void initialize() …Run Code Online (Sandbox Code Playgroud) 我想写一个JUnit测试来验证下面的代码使用BufferedInputStream:
public static final FilterFactory BZIP2_FACTORY = new FilterFactory() {
public InputStream makeFilter(InputStream in) {
// a lot of other code removed for clarity
BufferedInputStream buffer = new BufferedInputStream(in);
return new CBZip2InputStream(buffer);
}
};
Run Code Online (Sandbox Code Playgroud)
(FilterFactory是一个接口.)
到目前为止我的测试看起来像这样:
@Test
public void testBZIP2_FactoryUsesBufferedInputStream() throws Throwable {
InputStream in = mock(InputStream.class);
BufferedInputStream buffer = mock(BufferedInputStream.class);
CBZip2InputStream expected = mock(CBZip2InputStream.class);
PowerMockito.spy(InputHelper.BZIP2_FACTORY); // This line fails
whenNew(BufferedInputStream.class).withArguments(in).thenReturn(buffer);
whenNew(CBZip2InputStream.class).withArguments(buffer).thenReturn(expected);
InputStream observed = InputHelper.BZIP2_FACTORY.makeFilter(in);
assertEquals(expected, observed);
}
Run Code Online (Sandbox Code Playgroud)
对PowerMockito.spy的调用会引发此消息的异常:
org.mockito.exceptions.base.MockitoException:
Mockito cannot mock this class: class edu.gvsu.cis.kurmasz.io.InputHelper$1
Mockito can …Run Code Online (Sandbox Code Playgroud) 假设我有一个名为Interface的接口,以及一个名为Base的具体类,为了使事情变得更复杂,有一个需要一些参数的ctor.
我想创建一个扩展Base并实现Interface的匿名类.
就像是
Interface get()
{
return new Base (1, "one") implements Interace() {};
}
Run Code Online (Sandbox Code Playgroud)
这对我来说看起来很合理,但它不起作用!
(PS:实际上,接口和基础也是通用类:D.但我现在会忽略它)
我正在尝试创建一个辅助函数,添加currying,以生成类的常见设置.例如:
class Person {
private name: string;
private sex: string;
constructor (name: string, sex: string) {
this.name = name;
this.sex = sex;
}
}
var newPersonSex = function (sex: string) {
return function (name: string) {
return new Person(name, sex);
}
}
var MalePerson = newPersonSex('male');
var FemalePerson = newPersonSex('female');
Run Code Online (Sandbox Code Playgroud)
因此,现在当创建MalePerson和FemalePerson对象时,它实际上只返回Person的新实例.
var m = new MalePerson( 'john' );
Run Code Online (Sandbox Code Playgroud)
为了让类型系统允许我仍然使用'new',MalePerson需要是一个构造函数类型.例如:'new(name:string)=> Person'.这也需要是函数的返回类型.
但是添加了这些声明后,我无法从'newPersonSex'中返回一个函数.例如,这是无效的:
var newPersonSex = function (sex: string) : new(name:string) => Person {
return function (name: string) {
return new Person(name, …Run Code Online (Sandbox Code Playgroud) 我正在浏览oracle文档中的匿名类教程(https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html)
我已经复制了本教程中使用的代码.(注释Statement1和Statement2由我添加):
public class HelloWorldAnonymousClasses {
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
HelloWorld englishGreeting = new EnglishGreeting();
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde"; //Statement1
public void greet() {
greetSomeone("tout le monde");
}
public void …Run Code Online (Sandbox Code Playgroud) 我正在编写Eclipse插件,并且经常出现这样的情况,即正在运行的Job需要暂停一段时间,在UI线程上异步运行并恢复.
所以我的代码通常看起来像:
Display display = Display.getDefault();
display.syncExec(new Runnable() {
public void run() {
// Do some calculation
// How do I return a value from here?
}
});
// I want to be able to use the calculation result here!
Run Code Online (Sandbox Code Playgroud)
一种方法是让整个Job类都有一些字段.另一种方法是使用自定义类(而不是匿名类,并使用其生成的数据字段等.什么是最好和最优雅的方法?
当您使用私有内部类编译Java类时,似乎匿名类由于某种原因自动合成.这个类足以重现它:
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
Run Code Online (Sandbox Code Playgroud)
编译时,这会生成预期的SynthesizeAnonymous.class和SynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的SynthesizeAnonymous$1.class文件,该文件对应java.lang.Object于合成的匿名子类.如果你看一下反汇编javap,看来默认的构造函数InnerClass获得了这个匿名类型的隐藏参数,并null在new InnerClass()调用时传递给它.
为什么要创建这个类?即使InnerClass它不是静态的,也会创建它,但如果InnerClass不是私有的,或者没有InnerClass创建任何实例,则不会创建它.它是某种形式的访问控制?这是如何运作的?
我想知道是否可以更改 Android Studio 中的自动格式,将匿名类的大括号放置在同一行,同时仍将常规类、方法和块的大括号放置在新行上。
目前,IntelliJ 给了我这个结果:
class TestClass
{
public void test()
{
FooBar foo = new FooBar(new Runnable() // I want the brace here...
{ // ...not here.
@Override
public void run()
{
//
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望代码的格式如下:
class TestClass
{
public void test()
{
FooBar foo = new FooBar(new Runnable() { // <- Same Line
@Override
public void run()
{
//
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好,除了一个细节,即我无法像第二个示例中那样格式化大括号。这是不可能的还是我只是忽略了设置?
code-formatting intellij-idea anonymous-class android-studio
我想创建一个类,从匿名类定义中获取一个对象来存储.我使用泛型类来实现它.然后我想使用功能接口定义一些操作,这些接口将此对象作为要使用的参数.
代码说的不仅仅是文字.所以看看这个:
public class Test<T> {
@FunctionalInterface
public interface operation<T> {
void execute(T object);
}
private T obj;
public Test(T _obj){
obj = _obj;
}
public void runOperation(operation<T> op){
op.execute(obj);
}
public static void main(String[] args){
Test<?> t = new Test<>(new Object(){
public String text = "Something";
});
t.runOperation((o) -> {
System.out.println(o.text); // text cannot be resolved
});
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是o.text在功能接口的实现中无法解决.这是某种类型的擦除后果吗?
有趣的是,当我在构造函数中实现功能接口时,我可以使用此代码.
看看这段代码:
public class Test<T> {
@FunctionalInterface
public interface operation<T> {
void execute(T object);
}
private T obj;
private …Run Code Online (Sandbox Code Playgroud) 我有以下代码:
eventBus.subscribe(new EventBusListener<NavigationEvent>() {
@Override
public void onEvent(Event<NavigationEvent> event) {
event.getPayload();
}
});
eventBus.subscribe(new EventBusListener<NotificationEvent>() {
@Override
public void onEvent(Event<NotificationEvent> event) {
event.getPayload();
}
});
Run Code Online (Sandbox Code Playgroud)
IntelliJ告诉我,我可以用lambda表达式替换这两个匿名类,如:
eventBus.subscribe((EventBusListener<NavigationEvent>) Event::getPayload);
eventBus.subscribe((EventBusListener<NotificationEvent>) Event::getPayload);
Run Code Online (Sandbox Code Playgroud)
编译效果很好,但在运行时,出现以下错误的应用程序崩溃:java.lang.IllegalArgumentException: Could not resolve payload type引起getPayload()的Event<T>类.
我是缺少什么lamdbas和generics?
anonymous-class ×10
java ×6
generics ×2
lambda ×2
constructor ×1
eclipse ×1
java-8 ×1
mockito ×1
powermock ×1
private ×1
reflection ×1
typescript ×1