我有一个关于将子类列表分配给超类列表的基本问题.
所以我有以下内容:
Class B extends A;
List <B> bList = new ArrayList<B>();
List <A> aList = bList;
Run Code Online (Sandbox Code Playgroud)
为什么最后一次分配失败?对不起新手问题
可能重复:
List <Dog>是List <Animal>的子类吗?为什么Java的泛型不是隐式多态的?
Java Generics - 将子类列表分配给超类列表
使用原始类型,您可以轻松地说出类似的内容.
[...] // MyClass is generic with upper bound of Object
MyClass c = new MyClass<Double>();
[...]
Run Code Online (Sandbox Code Playgroud)
但这是不允许的
MyClass<Number> c = new MyClass<Double>()
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样.我的书告诉我为什么第二个不起作用,因为你不能添加一个整数MyClass<Double>.它没有解释的是为什么MyClass<Double>是MyClass<Object>(或等效的原始类型形式)的子类,因为double是object的子类.
那么,如果第二种形式不是第一种,为什么第一种允许.请意识到我是新手.
编辑:如果Number是上限,那么在第一个例子中会发生什么呢?
你可以在这里看到类型擦除的影响
class Untitled {
public static void main(String[] args) {
}
public static<T> void c(T t)
{
t.SubClassMethod();// this won't work because class Object has no such method. But if I change the upperbound to SubClass it will.
t.toString() // …Run Code Online (Sandbox Code Playgroud) 我有一个名为"父亲"的简单POJO和另一个名为"Son"的人,它扩展了"父亲",这是最简单的类继承示例.
现在我有一个List<Son>,我需要把它投到一个List<Father>.
我能怎么做?
编辑
抱歉命名错误,我没有解释自己.人与职工会是一个更好的例子.或者产品和计算机.
我想知道为什么List<Number>不能用List<Integer> 来调用它甚至整数是抽象类Number的扩展类?有一个逻辑错误,因为我可以使用参数Number和Integer调用Method.
public class Que
{
public void enterNumbers(List<Number> nummern)
{
for (Number number : nummern)
{
System.out.println(number + "\n");
}
}
public void enterNum(Number num)
{
System.out.println("This is a number " + num);
}
public static void main(String[] args)
{
Que que = new Que();
Integer myInteger = new Integer(7);
// possible (of course!)
que.enterNum(myInteger);
List<Integer> num = new ArrayList<Integer>();
num.add(4);
num.add(45);
Integer inte = new Integer(333);
num.add(inte);
// not possible !
que.enterNumbers(num);
}
} …Run Code Online (Sandbox Code Playgroud) 我已经尝试了这两段代码,但我两个都遇到了错误.下面附有两件作品和我得到的两个错误.如果发生这种情况,我将不胜感激.
例1
static List<String> list = new ArrayList<String>();
public static void main(String[] args) {
func(list);
}
private static void func(List<Object> lst) {
}
Run Code Online (Sandbox Code Playgroud)
错误:
The method func(List<Object>) in the type is not applicable for the arguments (List<String>)
例2
static List<Object> list = new ArrayList<Object>();
public static void main(String[] args) {
func(list);
}
private static void func(List<String> lst) {
}
Run Code Online (Sandbox Code Playgroud)
错误:
The method func(List<String>) in the type is not applicable for the arguments (List<Object>)
为什么以下代码在Java中是错误的?
List<List<Integer>> list = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
我知道List<List<Integer>> list = new ArrayList<List<Integer>>()是正确的。
我正在尝试理解看似类似代码的不同编译结果.似乎有可能将a转换List<Object>为a,List<T>但仅限于T不受具体类限制.所以......
List<Object> bis = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
在下面的编译class Test<T>,以及在class Test<T extends CharSequence>,但不是class Test<T extends BigDecimal>也不class Test<T extends BigDecimal & CharSequence>.
List<T> result = (List<T>) bis;
Run Code Online (Sandbox Code Playgroud)
那么,T与类型和接口类型相关的区别在哪里呢?
编辑:
每个请求一些完整的代码.这将在第9行编译一个编译器警告.对于result像对象中的CharSequence结果实例进行操作一样,确实不安全ClassCastException.
public class Sandbox<T extends CharSequence> {
public static void main(String[] args) {
new Sandbox<CharSequence>().foo();
}
private void foo() {
List<Object> bis = Arrays.asList(Integer.valueOf(1));
List<T> result = (List<T>) bis;
System.out.println(result);
} …Run Code Online (Sandbox Code Playgroud) 这是一个快速的小通用类,使这个问题更容易理解.如果你愿意,你可以假装它"装箱"一个值.
public class Box<T> { }
Run Code Online (Sandbox Code Playgroud)
现在,在我的main方法中,我可以这样:
Box b1 = new Box<>();
Box<?> b2 = b1;
Box b3 = b2;
Run Code Online (Sandbox Code Playgroud)
所以我很清楚,带有通配符的raw Box和Box参数化都可以同时传递给彼此的类型.
Object box = (Box<?>)(Box) (Box<?>)(Box) ... new Box<>();// Valid (without the ellipsis)
Run Code Online (Sandbox Code Playgroud)
那么为什么我List的原始盒子不能被转换成List通配符盒,反之亦然?(如果你能找到它,那么任何负责编译错误的文档都会出现以下代码.)
List<Box> rawBoxes = new LinkedList<>();
List<Box<?>> wildcardBoxes = new LinkedList<>();
Object o1 = (List<Box<?>>) rawBoxes;// Cannot cast from List<Box> to List<Box<?>>
Object o2 = (List<Box>) wildcardBoxes;// Cannot cast from List<Box<?>> to List<Box>
Run Code Online (Sandbox Code Playgroud)
"不能施放 …
我有一个方法必须返回一个数组集合.(这是JUnit中的参数化测试.)实际上我只需要返回三个字符串,但它们需要在一个数组集合中.这是我的方法:
public static Collection<Object[]> browserList() {
String[] firefox = { "firefox" };
String[] chrome = { "chrome" };
String[] ie = { "ie" };
ArrayList<String[]> list = new ArrayList<String[]>(3);
list.add(firefox);
list.add(chrome);
list.add(ie);
return list;
}
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误:Type mismatch: cannot convert from ArrayList<String[]> to Collection<Object[]>.
所以真的有两个问题:(a)这有什么问题,考虑到这ArrayList是一个实现Collection并String从中衍生而来Object; (b)我该如何解决?
谢谢你的帮助.
用一个例子解释问题:
public class DataWrapper<T> {
T data;
};
DataWrapper<Object> obj1 = new DataWrapper<Object>();
List<DataWrapper<?>> anyDataList = Arrays.asList(obj1); //this doesn't work
DataWrapper<Integer> objInt = new DataWrapper<Integer>();
anyDataList = Arrays.asList(obj1, objInt); //this work
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么"Arrays.asList(obj1)"不起作用?