Java Scala泛型混淆

Java Scala泛型混淆,java,scala,generics,parameterized-types,Java,Scala,Generics,Parameterized Types,我有一些通用/OOP Scala代码(不有用,只是课堂练习) 我有一个容器接口“IterableContainer”,它接收并返回类型为AnyRef子类的对象。它有一个具体的子类,该子类还接收并返回类型为AnyRef子类的对象 trait IterableContainer[Type <: AnyRef] { def length: Int def getAt(index: Int): Type def append(element: Type) }

我有一些通用/OOP Scala代码(不有用,只是课堂练习)

我有一个容器接口“IterableContainer”,它接收并返回类型为AnyRef子类的对象。它有一个具体的子类,该子类还接收并返回类型为AnyRef子类的对象

  trait IterableContainer[Type <: AnyRef] {

    def length: Int

    def getAt(index: Int): Type

    def append(element: Type)
  }

  class IterableArrayList[T <: AnyRef]() extends IterableContainer[T] {

    val underlyingContainer = new ArrayBuffer[T](16)

    override def length: Int = {
      return underlyingContainer.length
    }

    override def getAt(index: Int): T =
    {
      if (index < underlyingContainer.length) {
        return underlyingContainer(index)
      } else {
        return null // Expression of type T does not conform to expected type. 
      }
    }

    override def append(element: T) = {
      underlyingContainer :+ element // :+ means append
    }
  }

trait-IterableContainer[Type问题在于
T:Null

我认为唯一的反例是
什么都没有

IterableArrayList
的类型参数上添加一个额外的(较低的)类型绑定会使编译器感到高兴:

class IterableArrayList[T >: Null <: AnyRef]() extends IterableContainer[T] {
使用异常的示例:

override def getAt(index: Int): T = underlyingContainer(index)

请注意,如果索引无效,则底层的
ArrayBuffer
已抛出
IndexOutOfBoundsException
。如果用户传入负索引,这还具有正常工作的附加优势。。。(您可能想添加一个
0仅供参考,您对
return
的使用不是很惯用。实际上,您可以从代码中删除所有
return
s,它仍然可以工作(这将被视为“更好的样式”)。此外,您的
append
方法当前具有返回类型
Unit
…可能不是您想要的。我不想让append方法返回任何内容-只需添加一些内容并返回void(Unit)。此外,当我这样做时:“+”对于append,它实际上并没有附加任何内容-ArrayBuffer的长度保持在零。啊,这是有道理的。您应该尝试使用
+=
而不是
:+
:+
返回一个新集合,而不是对原始集合进行变异。)因此我要么返回一些[t]还是没有?@MichaelLafayette-是的,请看我添加的示例。
override def getAt(index: Int): T = underlyingContainer(index)