【问题标题】:How to subclass generics properly?如何正确地继承泛型?
【发布时间】:2014-09-06 06:59:34
【问题描述】:

我已经搜索了其他问题/答案,但我仍然对这个 JAVA ISSUE 感到困惑。

如果我想对一个接受泛型参数的类型进行子类化,我将如何在子类中使用泛型参数而不被遮蔽?

例如:

public class A <T> extends ArrayList<T> {}

所以,如果我实例化我的自定义类,比如 Integers 作为参数,它是否也将该值作为 &lt;T&gt; 的 ArrayList 部分的参数?如果不是,那么我将如何指定 ArrayList 的类型?

而且我知道在许多情况下子分类容器可能不是最好的主意,但在这种情况下我认为它是合适的。

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    是的,这就是我们的方式。

    public static void main(String[] args) {
        B<Integer> b = new B<Integer>();
        b.a = 1;
        b.b = "one";
    
        b.add(1);
        b.add(2);
    }
    
    public static class A<T> extends ArrayList<T> {
        public T a;
    }
    
    public static class B<T> extends A<T> {
        public T b;
    }
    

    如果你愿意,你甚至可以让它们有不同的类型,只要你也为超类提供它的类型:

    public static void main(String[] args) {
        B<Integer, String> b = new B<Integer, String>();
        b.a = 1;
        b.b = "one";
    
        b.add(1);
        b.add(2);
    }
    
    public static class A<T> extends ArrayList<T> {
        public T a;
    }
    
    public static class B<U, T> extends A<U> {
        public T b;
    }
    

    【讨论】:

    • 好吧,我还不清楚。那么在菱形括号中,U 是作为类型传递给 A 超类的吗?这些占位符是否被视为变量,所以 U 总是相同的,而 T 总是相同的,等等?如果我使用不同的类型,是否必须为子类提供两个泛型类型才能传递给超类的类型?
    • a) 是的,U 正在传递给超类。是的,U 只是B 类中的一个通用参数,以便将其传递给A b) 占位符被视为占位符,所以是的,它们是常量。 c) 如果您希望类的用户输入类型,则必须有两个泛型类型,您可以使用class B&lt;T&gt; extends A&lt;Integer&gt; 和硬编码A 的类型,并且让B 成为唯一具有泛型的类成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2015-09-15
    • 2021-10-29
    • 2019-03-07
    • 2017-10-28
    • 2011-05-01
    相关资源
    最近更新 更多