如何返回扩展某些内容的通用类型T的列表

亚历克斯·格

我在返回扩展某些内容的通用类型T的列表时遇到问题。

我有一个称为A的基类,以及2个子类B和C。我想从某个方法返回B的列表或C的列表,具体取决于某些上下文,但是我无法让编译器同意它。

我的意思是:

import java.util.List;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        List<B> ls1 = new Main().method1();
        List<C> ls2 = new Main().method2(); // Won't work,
                                            // have to cast to it
        // i.e. List<C> ls2 = (List<C>) new Main().method2();

        System.out.println(ls1);
        System.out.println(ls2);
    }

    <T extends A> List<T> method1() {
        List<B> ls = new ArrayList<>();
        ls.add(new B());
        return ls; // Doesn't work now, compiler error
                   // works if I explicitly cast to it, but says
                   // unsafe or unchecked operation
                   // return (List<T>) ls;
    }

    List<? extends A> method2() {
        List<C> ls = new ArrayList<>();
        ls.add(new C());
        return ls;
    }
}
class A {
}
class B extends A {
}
class C extends A {
}

如您所见,我尝试了通配符和实际类型T,但是它们都没有摆脱编译器错误:“不兼容的类型”。

任何帮助将不胜感激,谢谢。

保利先生

说列表包含类型B的项目并允许类型的项目C存在其中是危险的可以肯定地说,该列表包含一个接口或超类。

这是一个引发运行时异常的危险示例。

import java.util.*;

public class Main {
    public static class A {
        public String getA() { return "A"; }
        @Override public String toString() { return getA(); }
    };
    public static class B extends A {
        public String getB() { return "B"; }
        @Override public String toString() { return getB(); }
    }
    public static class C extends A {
        public String getC() { return "C"; }
        @Override public String toString() { return getC(); }
    }

    public static void main(String[] args) {
        List<B> ls1 = new Main().method3();
        List<C> ls2 = new Main().method3();

        // Will work, because toString() for each class is handled by each class.
        System.out.println(ls1);
        System.out.println(ls2);

        // Runtime errors!
        ls1.stream().map(B::getB).forEach(System.out::println);
        ls2.stream().map(C::getC).forEach(System.out::println);
    }

    public static <T extends A> List<T> method3() {
        return Arrays.asList((T) new A(), (T) new B(), (T) new C());
    }
}

列表的类型应该是一个共同的祖先,例如,List<A> ls1以便您可以在遍历列表时安全地调用通用方法。

public static void main(String[] args) {
    List<A> ls3 = new Main().method3();

    ls3.stream().map(A::toString).forEach(System.out::println);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何正确扩展数组的通用返回类型

来自分类Dev

如何从函数返回通用列表(Of T)

来自分类Dev

具有特定类型的通用列表的扩展?

来自分类Dev

如何创建class <T>的开放通用类型列表?

来自分类Dev

如何将类型列表输入通用类<T>

来自分类Dev

如何设置通用返回类型

来自分类Dev

如何根据某些条件返回集合中 T 类型的索引?

来自分类Dev

使用通配符返回通用类型对象的列表

来自分类Dev

Java-返回指定通用类型的列表

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

如何限制通用扩展名的类型

来自分类Dev

如何扩展接受数组通用元素的类型?

来自分类Dev

如何扩展在C#中返回通用值的通用类?

来自分类Dev

从超类型的扩展列表返回子类型对象的列表

来自分类Dev

类型列表中的C#通用方法返回类型

来自分类Dev

VB语法:函数的返回类型,返回通用列表的动态数组

来自分类Dev

递归函数如何返回某些内容?

来自分类Dev

递归函数如何返回某些内容?

来自分类Dev

扩展通用类型-PriorityQueue

来自分类Dev

扩展通用类型-PriorityQueue

来自分类Dev

打字稿通用类型参数:T vs T扩展{}

来自分类Dev

如何定义返回列表的通用Java方法

来自分类Dev

如何使用QueryOver返回通用列表

来自分类Dev

扩展函数返回包含特定列表类型作为参数的列表

来自分类Dev

通用方法的通用返回类型

来自分类Dev

通用方法的通用返回类型

来自分类Dev

通用C#方法,返回指定类型的列表

来自分类Dev

如何在Plone上扩展扩展的内容类型

来自分类Dev

如何编写扩展方法以返回使用的类型?