如果Object是不使用反射的数组,我如何在Java中看到?如何在不使用反射的情况下迭代所有项目?
我使用谷歌GWT所以我不允许使用反射:(
我想在不使用refelection的情况下实现以下方法:
private boolean isArray(final Object obj) {
//??..
}
private String toString(final Object arrayObject) {
//??..
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句:我也不想使用JavaScript,以便我可以在非GWT环境中使用它.
在我的一个Java项目中,由于Java处理(而非)原语的方式,我受到代码重复的困扰.具有相同的变化手工复制到四个不同的位置(之后int,long,float,double)再次,对于第三次的时候,再和再次我来到非常接近(?)来抢购.
在各种形式中,这个问题已经在StackOverflow上提出了:
共识似乎趋向于两种可能的替代方案:
好吧,第二个解决方案就是我现在正在做的事情,它对我的理智慢慢变得危险,就像众所周知的折磨技术一样.
自从提出这些问题并且Java 7出现以来已过去两年了.因此,我希望有一个更简单和/或更标准的解决方案.
Java 7是否有任何可能在这种情况下缓解压力的变化?我在简明的变更摘要中找不到任何内容,但也许在某处有一些不起眼的新功能?
虽然源代码生成是另一种选择,但我更喜欢使用标准JDK功能集支持的解决方案.当然,使用cpp或其他代码生成器可以工作,但它添加了更多的依赖项,并需要更改构建系统.
似乎JDK支持的唯一代码生成系统是通过注释机制.我设想一个可以像这样扩展源代码的处理器:
@Primitives({ "int", "long", "float", "double" })
@PrimitiveVariable
int max(@PrimitiveVariable int a, @PrimitiveVariable int b) {
return (a > b)?a:b;
}
Run Code Online (Sandbox Code Playgroud)
理想的输出文件将包含此方法的四个请求变体,最好使用相关的Javadoc注释等.是否有某处注释处理器来处理这种情况?如果没有,构建一个会怎样?
也许最近出现了一些其他技巧?
编辑:
一个重要的注意事项:除非我有理由,否则我不会使用原始类型.即使是现在,在某些应用程序中使用盒装类型也会产生非常真实的性能和内存影响.
编辑2:
使用max()作为示例允许使用compareTo()所有数字盒装类型中可用的方法.这有点棘手:
int sum(int a, int b) {
return a …Run Code Online (Sandbox Code Playgroud) 具有某种反射/内省规范的语言的巨大好处之一是可以从各种来源自动构建对象.
例如,在Java中,我可以使用相同的对象来持久化到db(使用Hibernate),序列化为XML(使用JAXB),以及序列化为JSON(json-lib).您可以在Ruby和Python中执行相同的操作,通常也遵循一些简单的Java属性或注释规则.
因此,我不需要很多"域转移对象".我可以专注于我正在工作的领域.
它似乎在像Haskell和Ocaml这样非常严格的FP中,这是不可能的.特别是Haskell.我唯一看到的是进行某种预处理或元编程(ocaml).只是接受你必须从底部向上进行所有转换吗?
换句话说,您必须做很多无聊的工作才能将haskell中的数据类型转换为JSON/XML/DB Row对象,然后再转换回数据对象.
我需要对各种原始类型执行算法; 算法基本相同,但变量的类型除外.所以,例如,
/**
* Determine if <code>value</code> is the bitwise OR of elements of <code>validValues</code> array.
* For instance, our valid choices are 0001, 0010, and 1000.
* We are given a value of 1001. This is valid because it can be made from
* ORing together 0001 and 1000.
* On the other hand, if we are given a value of 1111, this is invalid because
* you cannot turn on the second bit from left by ORing together …Run Code Online (Sandbox Code Playgroud) 通常,编译器会生成执行装箱和拆箱的代码.但是,如果不需要盒装值,编译器会是什么?(Oracle标准)编译器是否足够智能以优化它?
看看这个方法:
public static void requireInRange(int index, Object[] array) {
if(index < 0 || index >= array.length)
throw new IndexOutOfBoundsException();
}
Run Code Online (Sandbox Code Playgroud)
唯一相关的信息是array.length,例如,将数组的每个值包装起来是没用的.喜欢这段代码:
int[] anArray = {3, 4, 2};
requireInRange(3, anArray);
Run Code Online (Sandbox Code Playgroud)
编译器是否会实际插入用于装箱数组的每个值的代码?
这不是功课.
是否可以编写泛型方法,如下所示:
<T extends Number> T plusOne(T num) {
return num + 1; // DOESN'T COMPILE! How to fix???
}
Run Code Online (Sandbox Code Playgroud)
没有使用一堆instanceof和演员,这可能吗?
以下3种方法编译:
Integer plusOne(Integer num) {
return num + 1;
}
Double plusOne(Double num) {
return num + 1;
}
Long plusOne(Long num) {
return num + 1;
}
Run Code Online (Sandbox Code Playgroud)
是否有可能编写约束仿制药T只Integer,Double或Long?
java ×5
arrays ×1
autoboxing ×1
generics ×1
gwt ×1
haskell ×1
instanceof ×1
ocaml ×1
performance ×1
primitive ×1