Java Scala泛型混淆
我有一些通用/OOP Scala代码(不有用,只是课堂练习) 我有一个容器接口“IterableContainer”,它接收并返回类型为AnyRef子类的对象。它有一个具体的子类,该子类还接收并返回类型为AnyRef子类的对象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) }
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)