Tag: 类型安全

Javagenerics:为什么someObject.getClass()不返回Class ?

我希望从编译时间以及运行时方面来看, .getClass()提供正确类型的返回值不会有问题。 但我一定是错的。 public class _GetClassGenerics2 { static class MyClass { } public static void main(String[] args) { MyClass myInstance = new MyClass(); // here it works Class type = myInstance.getClass(); myMethod(myInstance); } public static void myMethod(T instance) { Class type = instance.getClass(); // java.lang.RuntimeException: Uncompilable source code – incompatible types // required: java.lang.Class // […]

通过未经检查的类型转换在Java中创建通用数组

如果我有一个generics类Foo ,我不允许创建一个数组,如下所示: Bar[] bars = new Bar[]; (这将导致错误“无法创建Bar的通用数组”)。 但是,正如dimo414在回答这个问题(Java如何:通用arrays创建)中所建议的那样 ,我可以做到以下几点: Bar[] bars = (Bar[]) new Object[]; (这将“仅”生成警告:“类型安全:从Object []到Bar []”的未选中的强制转换。 在回应dimo414的回答的评论中,有些人声称使用这种结构可能会在某些情况下引起问题而其他人说它很好,因为对数组的唯一引用是bars ,它已经是所需的类型。 我有点困惑,在哪些情况下这是可以的,在哪些情况下,它可以让我遇到麻烦。 例如, newacct和Aaron McDaid的评论似乎直接相互矛盾。 不幸的是,原始问题中的评论流只是以未解答的“为什么这个’不再正确’?”结束,所以我决定为它提出一个新问题: 如果bars只包含Bar类型的条目,那么在使用数组或其条目时是否仍然存在任何运行时问题? 或者是唯一的危险,在运行时我可以在技术上将数组转换为其他东西(如String[] ),然后允许我用除Bar之外的类型的值填充它? 我知道我可以使用Array.newInstance(…) ,但我对上面的类型转换构造特别感兴趣,因为,例如,在GWT中newInstance(…) option不可用。

Java N-Tuple实现

我刚刚创建了一个类型安全的Java n-tuple。 我正在使用一些非传统的方法来实现类型安全(我只是为了好玩)。 有人可以就改进它或一些可能的缺陷提供一些意见。 public class Tuple { private Object[] arr; private int size; private static boolean TypeLock = false; private static Object[] lastTuple = {1,1,1}; //default tuple type private Tuple(Object … c) { // TODO Auto-generated constructor stub size=c.length; arr=c; if(TypeLock) { if(c.length == lastTuple.length) for(int i = 0; i<c.length; i++) { if(c[i].getClass() == […]

JSF和类型安全

当我挣扎了好几个小时后,我终于找到了那些烦人的ClassCastException来自哪里,我认为这是由Hibernate生成的,它是enum映射。 但它们来自我的JSF视图,我在其中传递了一个List 回到我的支持bean。 我的数据只包含枚举的值: public Role[] getRoles() { return Role.values(); } public Role[] getRoles() { return Role.values(); } 。 当我在User -class中测试roles的setter并得到这个时,我感到非常震惊: public void setRoles(List paramRoles) { System.out.println(paramRoles.get(0) instanceof Role); //output: false for(Role role : paramRoles){ …} //crashes with ClassCastException } 将List paramRoles更改为List paramRoles工作得很好。 这怎么可能? 这些generics不应该是类型安全的还是与JSF相关的类型擦除会导致整个类型的安全问题? 也不应该将h:selectManyCheckbox的返回值设为List ,就像我通过f:selectItems传入的一样?

Consumer 在HashMap中映射了Class

我想创建一个IdentityHashMap<Class, Consumer> 。 基本上,我想用一种方法来映射一个类型,说明如何处理这种类型。 我想动态地能够用对象X说出来,执行Y.我能做到 private IdentityHashMap<Class, Consumer> interceptor = new IdentityHashMap(); 但它很糟糕,因为那时我必须在使用它时将对象投射到lamba中。 例: interceptor.put(Train.class, train -> { System.out.println(((Train)train).getSpeed()); }); 我想做的是 private IdentityHashMap<Class, Consumer> interceptor = new IdentityHashMap(); 但似乎不允许这样做。 有没有办法做到这一点 ? 使用此类型的方法映射类型的最佳解决方法是什么?