Tag: generics

使用Java 6注释处理器获取generics类型的限定类名

我正在使用JDK 6的Annotation Processing API开发一个小代码生成器,并试图获得类中字段的实际generics类型。 为了更清楚,让我说我有这样一个类: @MyAnnotation public class User { private String id; private String username; private String password; private Set roles = new HashSet(); private UserProfile profile; } 这是我的注释处理器类: @SupportedAnnotationTypes({ “xxx.MyAnnotation” }) @SupportedSourceVersion(SourceVersion.RELEASE_6) public class MongoDocumentAnnotationProcessor extends AbstractProcessor { private Types typeUtils = null; private Elements elementUtils = null; @Override public synchronized void init(ProcessingEnvironment […]

调用javagenerics方法

给出通用方法: List getGenericList(int i) {…} 以下代码编译时没有任何警告: public List getStringList(boolean b){ if(b) return getGenericList(0); else return getGenericList(1); } 但是这个会生成’Type mismatch’编译错误: public List getStringList(boolean b) { return (b) ? getGenericList(0) : getGenericList(1); } 为什么?

Javagenerics – 覆盖抽象方法并具有子类的返回类型

我正在尝试创建一个设置,其中一组子类覆盖超类。 这个超类包含一个抽象方法 – 理想情况下,它的返回类型是调用此方法的对象的返回类型,因此它的行为有效地如下: public abstract class SuperClass{ public abstract SuperClass getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } } 我不确定这样的事情是否可能,因为我认为返回类型总是必须相同才能使覆盖工作 – 但是我一直在想答案,如果存在的话,就在这条线的某个地方… public abstract class SuperClass{ public abstract getSelf(); } public class SubClass extends SuperClass{ @Override public SubClass getSelf(){ return this; } } 谢谢你的帮助。 编辑:添加扩展SuperClass到SubClass,呃

使用Asm字节码生成器生成具有generics类型的方法(ClassWriter)

使用Asm很容易定义简单的getter和setter(幸运的是,甚至在他们的FAQ中也有解释)。 但有一件事未提及,而我无法找到文档,是如何使用generics类型信息来实现这些。 我实际上能够很容易地确定generics类型信息(因为代码将采用现有的字段和/或方法,并且存在完整的generics类型处理和解析)。 我只需要为包含generics类型的类型生成generics版本。 我希望这就像修改签名的Asm ClassWriter / MethodVisitor调用一样容易,但文档中的一些注释表明它可能不那么容易(因为generics信息存储在与常规信息不同的位置)。 编辑 :看起来入口点是“ClassWriter.visitField / Method(….,String signature) – 请注意,它的”描述“包含正常的非generics类信息,但术语”签名“(在JLS中)具体指的是到generics – 包括类型信息。

简明地将Optional.absent()值传递给方法

使用Guava的Optional类型作为方法参数的一个问题是你不能简单地写 // method declaration public void foo(Optional arg); // compiler error foo(Optional.absent()); 由于类型推断失败,但必须明确添加类型: // real method call foo(Optional. absent()); 我怎么能避免呢?

理解此警告:可序列化类不声明静态最终serialVersionUID

我有一些静态初始化代码: someMethodThatTakesAHashMap(new HashMap() { { put(“a”,”value-a”); put(“c”,”value-c”);} }); 出于某种原因,我收到Eclipse的警告:serializable类没有声明静态的最终serialVersionUID。 这是抱怨匿名课吗? 我能做些什么,或者我应该压制它。

无法为类型变量分配INode类型值。 为什么?

我想知道为什么以下代码无法工作: public static List cloneList(List list) { List result = new ArrayList(list.size()); for (T t : list) result.add(t.clone()); <— problem here return result; } INode.clone()有INode返回类型,我们知道每个T都必须实现INode ,所以我很惊讶上面的代码没有编译。 我上面展示的是什么语义问题? 编辑:也许是因为在编译时Java将擦除generics类型,然后仍需要强制转换? 编译器难道不能为我做到这一点吗? EDIT2:这是INode : public interface INode { INode accept(Visitor visitor); INode clone(); } 谢谢

通用类型转换

我有以下类(简化但仍然是一个工作示例): class Test { List l = new ArrayList(); public Test() { } public void add(Object o) { l.add((T)o); } } 和测试代码: Test t = new Test(); t.add(1); t.add(1.2); t.add(-5.6e-2); t.add(“hello”); 一切都很好,这不是我所期待的。 add方法不应该抛出ClassCastException吗? 如果我添加一个或多或少相同的get方法: public T get(int i) { return l.get(i); } …/… t.get(1); // OK. t.get(3); // OK (?) Double d = t.get(3); // […]

使用参数化类型来确定类型

我正在经历这个链接 Java通用类 – 确定类型 我试过这个程序。 package my; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericTypeIdentification { public static void main( String args[] ) { Node obj = new GenericTypeIdentification().new SubNode( 1 ); ParameterizedType parameterizedType = ( ParameterizedType ) obj.getClass().getGenericSuperclass(); Type clazz = parameterizedType.getActualTypeArguments()[0]; if ( clazz == Integer.class ) { System.out.println( 1 ); } else { […]

关于PECS javagenerics

阅读Java Essentials,第2版,有一个名为PECS的规则,用于方法参数中的类型安全。 如果它产生你的延伸,消耗你使用超级。 对不起,如果我定义错了,因为我没有得到它。 任何人都可以阐明Joshua Bloch所指的生产者/消费者吗?