我有一个参数化的界面,以多种不同的方式实现.在运行时,我需要弄清楚,给定一个实现该接口的任意对象,接口的实际类型参数是什么.
这是一个解释问题的片段,以及解决问题的中途尝试(也在ideone.com上):
import java.util.*;
import java.lang.reflect.*;
interface Awesome<X> { }
class Base<E> implements Awesome<Set<E>> { }
class Child extends Base<List<Integer>> { }
class AwesomeExample {
public static void main(String[] args) {
Awesome<Set<List<Integer>>> x = new Child();
System.out.println(
((ParameterizedType)
Child.class.getGenericSuperclass()
).getActualTypeArguments()[0]
);
// prints "java.util.List<java.lang.Integer>"
System.out.println(
((ParameterizedType)
Base.class.getGenericInterfaces()[0]
).getActualTypeArguments()[0]
);
// prints "java.util.Set<E>"
investigate(x);
// we want this to print "Set<List<Integer>>"
}
static void investigate(Awesome<?> somethingAwesome) {
// how to do this?
}
}
Run Code Online (Sandbox Code Playgroud)
看起来在运行时有足够的泛型类型信息来推断:
Child extends Base<List<Integer>>Base<E> …在哪个类中是length用Java定义的字段(例如,对于数组长度)?我能在Object课堂上看到它的定义吗?
编辑:为什么这个领域如此设计(任何与安全性或内存效率相关的事情)?
如果数值表达式包含不同数字类型的操作数(常量和变量),则根据以下规则将操作数提升为更大的类型:
byte,sbyte,char,short,ushort,他们得到转换成int键入int,那么所有操作数都将转换为intuint和int,那么所有的操作数转换为longlong,那么所有操作数都将转换为longulong和long,然后操作数转换为floatfloat,那么所有操作数都将转换为floatdouble,则所有操作数都转换为double假设数值表达式包含不同类型的操作数,所有操作数首先会转换为单个数字类型,然后运行时才会尝试计算结果吗?例如,如果变量b1和b2是的byte类型,而i1是int类型,将b1和b2 get转换为int计算之前(b1+b2):
int i2=(b1+b2)+i1
Run Code Online (Sandbox Code Playgroud) 如果我有一个32位二进制数,并且我想用我所拥有的16位数替换二进制数的低16位,并保持该数字的高16位以产生新的二进制数.我怎么能用简单的按位运算符呢?
例如,32位二进制数是:
1010 0000 1011 1111 0100 1000 1010 1001
Run Code Online (Sandbox Code Playgroud)
而我的低16位是:
0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)
结果是:
1010 0000 1011 1111 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
假设我想向Java添加一些小的语法糖.只是添加正则表达式模式文字,或者可能是base-2文字或多行字符串等等.没有什么主要的语法(至少现在).
怎么会这样做呢?
我是否需要扩展字节码编译器?(那可能吗?)
我可以编写Eclipse插件来进行简单的源代码转换,然后再将其提供给标准的Java编译器吗?
是否有正则表达式的风格,允许我计算*和+运算符匹配的重复次数?我特别想知道它是否可以在.NET平台下运行.
我想在文件中打印以下格式的输出..
1 Introduction 1
1.1 Scope 1
1.2 Relevance 1
1.2.1 Advantages 1
1.2.1.1 Economic 2
1.2.2 Disadvantages 2
2 Analysis 2
Run Code Online (Sandbox Code Playgroud)
我不能让页码在一行中垂直对齐.这该怎么做??
此C片段是合并算法实现的一部分:
out[i++] = (in1[i1] < in2[i2]) ? in1[i1++] : in2[i2++];
Run Code Online (Sandbox Code Playgroud)
有人可以解释它是如何工作的吗?
您可以使用例如JUnit来测试库的功能,但是如何测试其在泛型和通配符方面的类型安全性?
只针对编译的代码进行测试是一种"快乐路径"测试; 您是否也应该针对非类型安全的用法测试您的API并确认这些代码不编译?
// how do you write and verify these kinds of "tests"?
List<Number> numbers = new ArrayList<Number>();
List<Object> objects = new ArrayList<Object>();
objects.addAll(numbers); // expect: this compiles
numbers.addAll(objects); // expect: this does not compile
Run Code Online (Sandbox Code Playgroud)
那么如何验证您的通用API在编译时引发了正确的错误?您是否只是构建一个非编译代码来测试您的库,并将编译错误视为测试成功,反之亦然?(当然你必须确认错误是与泛型相关的).
是否有促进此类测试的框架?