java - Java 构造函数中的泛型?

标签 java generics wildcard bounded-wildcard

考虑这个假设的类(我在在线视频中找到的):

public class Contrived<T extends Number> extends ArrayList<T> {
      List <? extends T> values;
      ......
    }

这里的类型变量Contrived可以接受的是NumberNumber 的某些子类型。但该类本身继承自 ArrayList ,因此无论该类获得什么类型,都将决定 ArrayList 的类型.

现在有一个名为 values 的字段,即List<? extends T values> 。那么这是什么意思呢? 是否 list可以容纳任何延伸的东西T (进而扩展 Number )。

作者:PECS (producer extends, consumer super)规则,我只能用这个List吗?读取元素但不添加到 list .

constructor将如何看起来,如果我需要传递 list of doubles or some type T

最佳答案

您可以有一个采用 List<T> 的构造函数或List<? extends T> 。继续设计类:

class B extends Number{
   public double doubleValue() { return 0; }
   public float floatValue() { return 0; }
   public long longValue() { return 0; }
   public int intValue() { return 0; }
}
class C extends B{}

我向 Contrived 添加了一个人为的、合法的构造函数上课,参加List<? extends T> :

public Contrived(List<? extends T> values)
{
   this.values = values;
}

这让我可以写一个 main方法如下:

public static void main(String[] args)
{
   List<C> bList = Arrays.asList(new C(), new C(), new C());
   Contrived<B> ci = new Contrived<B>(bList);
}

我可以通过List<C>进入 Contrived<B> 的构造函数.

另一种设计的构造函数对于 Contrived 是合法的可能是,采取 List<T> :

public Contrived(List<T> values)
{
   this.values = values;
}

这样的构造函数不允许 List<C>对于Contrived<B> ,因为现在类型必须匹配,如以下两个 Contrived示例:

public static void main(String[] args)
{
   List<C> cList = Arrays.asList(new C(), new C(), new C());
   Contrived<C> ci = new Contrived<C>(cList);  // must match now
}

还有

public static void main(String[] args)
{
   List<B> bList = Arrays.asList(new B(), new B(), new B());
   Contrived<B> ci = new Contrived<B>(bList);  // must match now
}

关于java - Java 构造函数中的泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21742670/

相关文章:

java - 将 JMenuItem 添加到已经可见的 JMenu

java - 将 slf4j 路由到 log4j,而不是相反

c# - 在 C# 中寻找高性能的最佳数据结构

Java 错误 : CAP#1, int 其中 CAP#1 是新的类型变量 : CAP#1 extends Object from capture of?

java - hibernate中自定义Long类型ID生成

java - URI Java URI 语法异常

kotlin - Kotlin 泛型中列表和可变列表的区别

java - 使用反射将子类类型传递给 Java 泛型方法不会引发异常

java - 我的通配符实现有什么问题?

linux - 如何从字符类的范围中排除字符?