我想创建一个类型为T
的泛型类,然后创建一个包含类型T
的值的内部类的实例。我想如果我使用上限告诉T
必须是例如的子类型。 String
,我将能够创建使用String
初始化的内部类的实例。
class Test[T <: String] {
private class TestEntry(val value: T)
def init: Unit = {
new TestEntry("")
}
}
但是我收到以下错误:
<console>:12: error: type mismatch;
found : java.lang.String("")
required: T
new TestEntry("")
^
实际上,就我的目的而言,它会省略上限并调用new TestEntry(null)
,但编译器甚至不接受null
。
我错过了什么?
修改
让我重新说一下我的例子,我需要这样的事情:我应该能够用任何特定的汽车测试抽象的豪华汽车服务,而无需重新实施测试方法。因此,抽象类(或特征)和方法都应该适用于豪华汽车的子类。
class Car
class LuxuryCar extends Car
class Mercedes extends LuxuryCar
class Ferrari extends LuxuryCar
trait LuxuryCarService[CarType <: LuxuryCar] {
def testWithCar(car: CarType): Unit = {}
def testWithARandomLuxuryCar: Unit = test(new Mercedes)
def testWithNoCar: Unit = test(null)
}
trait MercedesCarService extends LuxuryCarService[Mercedes]
答案 0 :(得分:5)
您已经告诉它T
是String
的子类。然后转身并尝试为其分配一个字符串!这不会起作用,不止于此:
class Car {}
class Mercedes extends Car {} // Mercedes <: Car (T could be Mercedes)
def serviceLuxuryCar(m: Mercedes) {} // This is like your TestEntry
serviceLuxuryCar(new Car) // This won't work, it's not a Mercedes!
我不确定你的代码实际意味着什么,但你所写的不应该(而且,正如你发现的那样)不起作用。
答案 1 :(得分:2)
放开类型参数。将内容声明为LuxuryCar
而不是CarType
。为什么你认为你需要一个类型参数?
答案 2 :(得分:0)
我应该能够使用任何特定的汽车测试抽象的豪华汽车服务,而无需重新实施测试方法。
那就是那种类型应该说的:
def testWithCar(car: Car): Unit = {} // or LuxuryCar if you meant "with any specific luxury car"
答案 3 :(得分:0)
我可能会遗漏一些东西,但是......为什么要在这里使用通用? 换句话说,为什么不呢
trait LuxuryCarService[LuxuryCar]