Tag: generics

自绑定generics类型,具有流畅的接口和inheritance

我使用流畅的inheritance接口。 我声明基类Constructor受到保护,所以你不能创建一个Foo ,它会在调用add()时导致ClassCastException。 但我遇到了返回新Foo实例的静态方法的问题。 public class Foo<T extends Foo> // if i change to extends Foo i only get warnings { public static Foo createFoo() // <– error { return new Foo(); // <– error } protected Foo() {} public T add() { //… return (T)this; } } public class Bar extends Foo { public […]

不兼容的类型和新的类型变量

我收到以下编译消息: [javac] … error: incompatible types [javac] exceptionClassHolder = new Holder( (new Exception()).getClass() ); [javac] ^ [javac] required: Holder<Class> [javac] found: Holder<Class> [javac] where CAP#1 is a fresh type-variable: [javac] CAP#1 extends Exception from capture of ? extends Exception [javac] 1 error 在我看来,根据信息所有应该是正确的。 CAP#1确实扩展了Exception。 那么如何理解上述信息呢? 下面的SSCCE(最初没有发布,因为我希望在一般情况下理解错误消息本身): class Holder { public T t; public Holder(T t) […]

T扩展SomeClass有什么意义?

与这样的方法声明有什么区别: public void doSomething(T obj) { // Do something. } 和这个: public void doSomething(SomeClass obj) { // Do Something. } 我看到它的方式,它们都指定传入的对象必须是SomeClass类型的子类,那么为什么在这个实例中根本没有使用generics呢?

接口如何包含在其签名或返回类型中引用接口的具体实现类型的方法?

假设我正在设计类似以下界面: public interface MyInterface{ public MyInterface method1(); public void method2(MyInterface mi); } 但是,需要注意的是, method1的返回类型和method2的参数与具体实现相匹配,而不仅仅是MyInterface 。 也就是说,如果我有实现MyInterface ,它需要具有以下内容: public class MyInterfaceImpl implements MyInterface{ @Override public MyInterfaceImpl method1(){…} @Override public void method2(MyInterfaceImpl mi){…} } 如上所述, method1不会导致任何编译错误,但没有任何保证返回类型在所有实现中都匹配。 当然, method2甚至不会编译,因为签名与接口不匹配。 一个候选解决方案是在generics中使用自引用或递归边界: public interface MyInterface<T extends MyInterface>{ public T method1(); public void method2(T mi); } public class MyInterfaceImpl implements MyInterface{ […]

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传入的一样?

为什么generics类型不适用于参数扩展超类?

这是我一直试图找到解决方案的问题。 我们有两个类定义。 其中一个扩展另一个。 class T{} class TT extends T{} 要求是应该有一个列表保持对象扩展T List list = new ArrayList(); 但是当我尝试将TT对象(几乎不是它的子类)放入列表时,问题就出现了。 list.add(new TT()); 编译错误消息 类型List中的方法add(捕获#2-of?extends Cell)不适用于参数(Cell)

Javagenerics方法:超级不能用?

所以我有这个方法: protected void collectSelectedItems(ListSelectionModel lsm, Collection result) { for (int i : GUI.getSelectionIndices(lsm)) { result.add(getItemByDisplayIndex(i)); } } 我想返回集合而不是void方法: protected Collection collectSelectedItems(ListSelectionModel lsm, Collection result) { for (int i : GUI.getSelectionIndices(lsm)) { result.add(getItemByDisplayIndex(i)); } return result; } MyItemClass extends MyItemBaseClass这样的事情( MyItemClass extends MyItemBaseClass ): List list = collectSelectedItems(lsm, new ArrayList()); 但我在super上遇到语法错误: 令牌“super”的语法错误,预期 是什么赋予了? 我能解决这个问题吗?

Java接口扩展了Comparable

我希望有一个由T A参数化的接口A ,并且还希望实现它的每个类也实现Comparable (使用T及其子类型)。 编写interface A extends Comparable似乎很自然interface A extends Comparable interface A extends Comparable ,但这不起作用。 那我该怎么办呢?

反序列化Gson中的通用列表

我想编写一个generics函数,用Gson反序列化generics类型List,代码如下: private List GetListFromFile(String filename) { //Read textfile BufferedReader reader; String data=””; try { reader = new BufferedReader(new FileReader(filename)); data = reader.readLine(); reader.close(); } catch (FileNotFoundException ex) { } catch (IOException ex) { } if (data == null) { List Spiel = new ArrayList(); return Spiel; } else { //get list with Deserialise Gson gson […]

Java集合协方差问题

假设我们有一个包含这些类的程序: public interface AbstractItem { } public SharpItem implements AbstractItem { } public BluntItem implements AbstractItem { } public interface AbstractToolbox { //well the problem starts here… public List getItems(); } public ExpensiveToolbox implements AbstractToolbox { private List items = new ArrayList(); public List getItems() { return this.items; } } public CheapTooblox implements AbstractToolbox { […]