Tag: generics

何时在Java Generics中使用通配符?

这是来自HeadFirst Java :(第575页) 这个: public void takeThing(ArrayList list) 与此相同: public void takeThing(ArrayList list) 所以这是我的问题:如果它们完全相同,我们为什么不写 public void takeThing(ArrayList list) 要么 public void takeThing(ArrayList list) 此外,何时使用?有用? 使用generics或类声明而不是方法声明中的T(如上所述)? 有什么好处?

为什么List .toArray()返回Object 而不是String ? 如何解决这个问题?

有谁知道为什么Java 1.6有这种行为: List list = ArrayList(); String[] arr = (String[]) list.toArray(); 我得到一个ClassCastException,因为它返回Object []而不是String []。 我以为List.toArray()应该返回T [] – 不是吗? 有没有人有答案为什么语言中存在这种不便? 还有如何解决这个问题? 如何从List获取String []而不通过项目循环?

无法从List 转换为List <List >

原始列表转换为List就好了。 为什么原始列表列表不能转换为List ? { // works List raw = null; List wild = raw; } { // Type mismatch: cannot convert from List to List<List> List raw = null; List<List> wild = raw; } 背景故事 (缓解xy问题 ): 我正在使用的API返回List 。 我碰巧知道它始终是List<JAXBElement> 。 我打算循环并构建自己的List ,但是当我编写List raw = api();时,我试图修复(但不是抑制)原始类型编译器警告List raw = api(); 。 我试过了: List<JAXBElement> raw = api(); […]

generics类中的Javagenerics方法

如果在Java中创建generics类(该类具有generics类型参数),您可以使用generics方法(该方法采用generics类型参数)吗? 请考虑以下示例: public class MyClass { public K doSomething(K k){ return k; } } public class MyGenericClass { public K doSomething(K k){ return k; } public List makeSingletonList(K k){ return Collections.singletonList(k); } } 正如您对通用方法所期望的那样,我可以使用任何对象在MyClass实例上调用doSomething(K) : MyClass clazz = new MyClass(); String string = clazz.doSomething(“String”); Integer integer = clazz.doSomething(1); 但是,如果我尝试使用MyGenericClass实例而不指定generics类型,我调用doSomething(K)将返回一个Object ,无论传入的是什么K : MyGenericClass untyped = new […]

为什么javac抱怨与类的类型参数无关的generics?

请按顺序阅读代码中的注释,问题详情如下。 为什么会发生这种差异? 如果可能,请引用JLS。 import java.util.*; /** * Suppose I have a generic class * @param with a type argument. */ class Generic { // Apart from using T normally, T paramMethod() { return null; } // the class’ interface also contains Generic Java Collections // which are not using T, but unrelated types. List unrelatedMethod() […]

使用Java Generics为实体实现转换器

我正在使用Spring和Hibernate开发JSF项目,其中包括许多遵循相同模式的Converter : getAsObject接收对象id的字符串表示forms,将其转换为数字,并获取给定种类的实体和给定的id getAsString接收和实体并返回转换为String的对象的id 代码基本上如下(省略检查): @ManagedBean(name=”myConverter”) @SessionScoped public class MyConverter implements Converter { private MyService myService; /* … */ @Override public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) { int id = Integer.parseInt(value); return myService.getById(id); } @Override public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) { return ((MyEntity)value).getId().toString(); } } 鉴于大量的Converter与此完全相同(当然除了MyService和MyEntity的类型),我想知道是否值得使用单个通用转换器。 通用本身的实现并不困难,但我不确定声明Beans的正确方法。 可能的解决方案如下: 1 – […]

异构容器,用于在Java中存储通用类型的对象

我试图从Effective Java跟随Joshua Bloch的类型安全异构容器模式来创建一个以Class为键的对象容器( MyGeneric )。 public class MyClass { private Map<Class, MyGeneric> myContainer = new HashMap<Class, MyGeneric>(); public void addToContainer(Class class, MyGeneric thing) { myContainer.put(class, thing); } public MyGeneric getFromContainer(Class class) { return (MyGeneric)(myContainer.get(klass)); } } 问题在于getFromContainer我必须执行未经检查的强制转换。 在Josh Bloch的容器中,他表演了一个安全演员 – 但就我而言,我看不出这是怎么回事。 有没有人有任何想法? 干杯,尼克。

如何将元素添加到通配符通用集合中?

为什么我用这个Java代码会出现编译器错误? 1 public List getFoos() 2 { 3 List foos = new ArrayList(); 4 foos.add(new SubFoo()); 5 return foos; 6 } 其中’SubFoo’是实现Foo的具体类,而Foo是一个接口。 我用这段代码得到的错误: 在第3行:“无法实例化ArrayList ” 在第4行:“方法添加(捕获#1-of?extends Foo)在类型List 中不适用于参数(SubFoo)” 更新:感谢Jeff C,我可以将第3行更改为“new ArrayList ();”。 但我仍然遇到第4行的问题。

用于 ‘? 延伸’和’? super’in Collection generics

谁能解释我们使用的原因? 在Collectiongenerics。 例如: List numberlist; List numberlist;

Java Raw Type和generics交互

如果我有一个Stack类 class Stack {} 现在,如果我这样做: 1) Stack s = new Stack() 2) Stack s = new Stack() 3) Stack s = new Stack() 谁能解释我这些互动(通用原始)会导致什么? 主要是我对第1点的疑问。事实上,如果我这样做,那么它是不安全的,因为该堆栈可以存储除Integer之外的其他类型。 是的,但是如果我有一个push方法并尝试存储除Integer以外的值,那么编译器会阻止我…所以当我有不安全的操作时?