具有上限的内部类

时间:2012-02-07 15:54:50

标签: generics scala scala-2.9

我想创建一个类型为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]

4 个答案:

答案 0 :(得分:5)

您已经告诉它TString的子类。然后转身并尝试为其分配一个字符串!这不会起作用,不止于此:

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]