相关疑难解决方法(0)

Java Generics - 将子类列表分配给超类列表

我有一个关于将子类列表分配给超类列表的基本问题.

所以我有以下内容:

Class B extends A;

List <B> bList = new ArrayList<B>();
List <A> aList = bList; 
Run Code Online (Sandbox Code Playgroud)

为什么最后一次分配失败?对不起新手问题

java generics

5
推荐指数
2
解决办法
8347
查看次数

原始类型和泛型 - Java

可能重复:
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)

java generics

5
推荐指数
1
解决办法
470
查看次数

将列表<Son>转换为List <Father>

我有一个名为"父亲"的简单POJO和另一个名为"Son"的人,它扩展了"父亲",这是最简单的类继承示例.

现在我有一个List<Son>,我需要把它投到一个List<Father>.

我能怎么做?

编辑

抱歉命名错误,我没有解释自己.职工会是一个更好的例子.或者产品计算机.

java collections casting list

5
推荐指数
1
解决办法
912
查看次数

为什么即使Integer扩展Number,也无法使用List <Integer>调用List <Number>?

我想知道为什么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)

java generics

5
推荐指数
2
解决办法
298
查看次数

类型中的方法func(List <Object>)不适用于参数(List <String>)

我已经尝试了这两段代码,但我两个都遇到了错误.下面附有两件作品和我得到的两个错误.如果发生这种情况,我将不胜感激.

例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 generics collections

5
推荐指数
2
解决办法
2万
查看次数

为什么List &lt;List &lt;Integer &gt;&gt; list = new ArrayList &lt;ArrayList &lt;Integer &gt;&gt;();错了?

为什么以下代码在Java中是错误的?

List<List<Integer>> list = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)

我知道List<List<Integer>> list = new ArrayList<List<Integer>>()是正确的。

java list arraylist

5
推荐指数
1
解决办法
2264
查看次数

将对象的列表转换为类的类型参数列表

我正在尝试理解看似类似代码的不同编译结果.似乎有可能将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)

java eclipse generics casting

5
推荐指数
1
解决办法
748
查看次数

Java无法从原始泛型类型列表转换为通配符泛型类型列表

这是一个快速的小通用类,使这个问题更容易理解.如果你愿意,你可以假装它"装箱"一个值.

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 BoxBox参数化都可以同时传递给彼此的类型.

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)

"不能施放 …

java generics raw-types

5
推荐指数
0
解决办法
213
查看次数

从ArrayList <String []>转换为Collection <Object []>?

我有一个方法必须返回一个数组集合.(这是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是一个实现CollectionString从中衍生而来Object; (b)我该如何解决?

谢谢你的帮助.

java junit junit4

4
推荐指数
1
解决办法
4353
查看次数

Java泛型:无界通配符不能与Object类型参数一起使用

用一个例子解释问题:

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)"不起作用?

java generics

4
推荐指数
1
解决办法
192
查看次数

标签 统计

java ×10

generics ×7

casting ×2

collections ×2

list ×2

arraylist ×1

eclipse ×1

junit ×1

junit4 ×1

raw-types ×1