java:从列表转换<;SomeClass>;列出<;SomeInterface>;当SomeClass实现SomeInterface时
我的大脑抽筋了:我有一个java:从列表转换<;SomeClass>;列出<;SomeInterface>;当SomeClass实现SomeInterface时,java,generics,Java,Generics,我的大脑抽筋了:我有一个公共接口SomeInterface和一个静态私有类SomeClass,试图从我的一个方法返回一个列表,但我得到了错误(在下面的返回列表;行上): 类型不匹配:无法从列表转换为 列表 如何在不创建新列表的情况下修复此问题 澄清:我不希望将列表创建为list(可能是显而易见的解决方案),因为私下里我想维护一个列表,以允许将来访问某个类的方法,而不仅仅是公共接口中的方法。下面的例子中没有显示这一点,但在我的实际程序中,我需要这个 import java.util.ArrayL
公共接口SomeInterface
和一个静态私有类SomeClass
,试图从我的一个方法返回一个列表
,但我得到了错误(在下面的返回列表;
行上):
类型不匹配:无法从列表转换为
列表
如何在不创建新列表的情况下修复此问题
澄清:我不希望将列表创建为list
(可能是显而易见的解决方案),因为私下里我想维护一个列表
,以允许将来访问某个类的方法,而不仅仅是公共接口中的方法。下面的例子中没有显示这一点,但在我的实际程序中,我需要这个
import java.util.ArrayList;
import java.util.List;
public class GenericList1 {
public interface SomeInterface
{
public int getX();
}
private static class SomeClass implements SomeInterface
{
final private int x;
@Override public int getX() {
return this.x;
}
public SomeClass(int x) { this.x = x; }
}
public static void main(String[] args) {
List<SomeInterface> list = createList(10);
printList(list);
}
private static void printList(List<SomeInterface> list) {
for (SomeInterface si : list)
System.out.println(si.getX());
}
private static List<SomeInterface> createList(int n) {
List<SomeClass> list = new ArrayList<SomeClass>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}
}
import java.util.ArrayList;
导入java.util.List;
公共类GenericList1{
公共接口
{
公共int getX();
}
私有静态类SomeClass实现SomeInterface
{
最终私有INTX;
@重写公共int getX(){
归还这个.x;
}
公共SomeClass(intx){this.x=x;}
}
公共静态void main(字符串[]args){
列表=创建列表(10);
打印列表(列表);
}
私有静态无效打印列表(列表){
对于(SomeInterface si:list)
System.out.println(si.getX());
}
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
您应该将您的方法重新定义为
private static List<? extends SomeInterface> createList(int n) { ...
私有静态列表与流行的观点相反,列表
与列表
完全没有关系,即使派生扩展基
类共享层次结构并不意味着它们的集合共享层次结构。一般来说,泛型也是如此
您可以按如下方式更改代码:
private static List<SomeInterface> createList(int n) {
List<SomeInterface> list = new ArrayList<SomeInterface>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i)); //add a SomeClass object - valid, because it has the interface
return list;
}
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
私有静态列表createList(int n){
列表=新的ArrayList();
对于(int i=0;i
我将更改方法的签名,如下所示:
private static void printList(List<? extends SomeInterface> list) {
for (SomeInterface si : list)
System.out.println(si.getX());
}
private static <T super SomeClass> List<T> createList(int n) {
List<T> list = new ArrayList<T>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}
private static void printList(Listyes,这是显而易见的解决方案,但我不想这样做;请看我的编辑。这是显而易见的解决方案,但我不想这样做;请看我的编辑。啊,好吧,这很有效。在我的实际程序中,我返回一个由集合包装的列表。unmodifiableList()因此,它们将是只读的。答案中有一个指向第28项的链接,但该链接现在已失效。该书的PDF可在此处获得:
private static List<SomeInterface> createList(int n) {
List<SomeInterface> list = new ArrayList<SomeInterface>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}
private static void printList(List<? extends SomeInterface> list) {
for (SomeInterface si : list)
System.out.println(si.getX());
}
private static <T super SomeClass> List<T> createList(int n) {
List<T> list = new ArrayList<T>();
for (int i = 0; i < n; ++i)
list.add(new SomeClass(i));
return list;
}