小编Yan*_*euc的帖子

调用Java通用方法

我正在研究Java通用功能,我不知道如何解释以下main方法中的第三行:

public class Example4 {
    public static void main(final String[] args) {
        System.out.println(Util.<String>compare("a", "b"));
        System.out.println(Util.<String>compare(new String(""), new Long(1)));
        System.out.println(Util.compare(new String(""), new Long(1)));
    }
}

class Util {
    public static <T> boolean compare(T t1, T t2) {
        return t1.equals(t2);
    }
}
Run Code Online (Sandbox Code Playgroud)

第一行编译,运行和返回(如预期的那样)false.

第二行没有按预期编译,因为我明确地混合StringLong.

第三行编译,运行并返回false但我不确定它是如何工作的:编译器/ JVM是否将参数类型实例T化为Object?(另外,有没有办法获得这个声明类型的T运行时?)

谢谢.

java generics type-erasure generic-method

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

Squeak中的拦截消息

我试图理解Smalltalk中更好的反映.我使用的是最新版本的Squeak(v4.3).我想拦截发送到我的一个类的实例的每个消息.我假设我可以覆盖这个方法,ProtoObject>>withArgs:executeMethod但是StéphaneDucasse向我解释说,出于性能原因,这个方法没有被使用(这是我自己对他答案的总结).我应该覆盖哪种方法/如何拦截已发送的消息?

这是我尝试的代码:

Object subclass: #C
    instanceVariableNames: 'i'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'CSE3009'.

C class compile: 'newWithi: anInt
    ^(self new) i: anInt ; yourself.'.

C compile: 'withArgs: someArgs executeMethod: aMethod
    Transcript show: ''Caught: ''.
    ^ super withArgs: someArgs executeMethod aMethod.'.

C compile: 'foo: aText
    Transcript show: aText.
    Transcript show: i.
    Transcript cr.'.

C compile: 'i: anInt
    i := anInt.'.

o := C newWithi: 42.
o foo: 'This is foo: '.
Run Code Online (Sandbox Code Playgroud)

执行这整段代码会产生:

This is foo: 42
Run Code Online (Sandbox Code Playgroud)

当我想要:

Caught: This …
Run Code Online (Sandbox Code Playgroud)

reflection smalltalk metaclass squeak objc-message-send

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

使用 GNU Make 同时构建调试和发布目标(扩展)

我想跟进这个问题及其答案...现在我可以构建两个不同的可执行文件,我想根据变量在不同的目录中构建可执行文件。

我想从这样的事情开始:

EXEDIR     = bin/release/
EXE        = $(EXEDIR)AmiModRadio
SOURCES    = $(wildcard *.c)
OBJECTSDIR = o/release/
OBJECTS    = $(addprefix $(OBJECTSDIR), $(SOURCES:.c=.o))

CC = vbcc:bin/vc
LD = vbcc:bin/vc

release : $(EXE) 
$(OBJECTS) : $(OBJECTSDIR)%.o : %.c
    $(CC) $(shell vbccprefs) -c $< -o $@
$(EXE) : $(OBJECTS)
    $(LD) $(shell vbccprefs) -o $(EXE) $(OBJECTS)
Run Code Online (Sandbox Code Playgroud)

像这样的东西:

EXE        = $(EXEDIR)AmiModRadio
SOURCES    = $(wildcard *.c)
OBJECTS    = $(addprefix $(OBJECTSDIR), $(SOURCES:.c=.o))

CC = vbcc:bin/vc
LD = vbcc:bin/vc

release : EXEDIR = bin/release/
release : OBJECTSDIR = …
Run Code Online (Sandbox Code Playgroud)

c gcc makefile gnu-make

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