【问题标题】:Java generics : wildcard and type parameter syntax when defining generic classJava泛型:定义泛型类时的通配符和类型参数语法
【发布时间】:2018-07-20 03:24:40
【问题描述】:

在下面的泛型方法声明示例中,我认为这两个方法声明是相同的,因为它们接受相同类型的参数。

public static <T extends List<? extends Number>> void fun(T arg){}
public static void foo(List<? extends Number> arg){}

好的,那为什么不允许使用下面的语法来定义泛型类呢?

public class foo<List<? extends Numer>> {}

根据oracle的Java教程,是不是因为我只能使用class name&lt;T1, T2, ..., Tn&gt; { /* ... */ }这个语法来定义泛型类?而且Java还提供了额外的语法糖来定义泛型方法?

所以,如果我想定义一个像public class foo&lt;T extends List&lt;U extends Number&gt;&gt; 这样的泛型类来使用TU,我只能通过以下方式进行: public class foo&lt;U extends Number, T extends List&lt;U&gt;&gt;?没有简洁的方法吗?

谢谢!

【问题讨论】:

    标签: java generics wildcard type-parameter


    【解决方案1】:

    从你的初衷...以下是一个有效的泛型类

    public class MyClass<T extends List<? extends Number>> {}
    

    可以如下使用...

    public class MyClass<T extends List<? extends Number>> {
        T myList;
    
        public T getMyList() {
            return myList;
        }
    
        public void setMyList(T myList) {
            this.myList = myList;
        }
    }
    
    public class Tester {
        public Tester() {
            MyClass<ArrayList<Number>> list = new MyClass<>();
            list.setMyList(new ArrayList<>());
            list.getMyList().add(new Integer(2));
            list.getMyList().add(new Long(3));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多