0

我想创建一个带有 type 参数的泛型类T,然后创建一个包含 type 值的内部类的实例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("")
                         ^

实际上,出于我的目的,可以省略上限和 call 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

4 回答 4

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!

我不确定您对代码执行的实际含义,但是您编写的内容不应该(并且不应该,正如您所发现的那样)起作用。

于 2012-02-07T16:02:57.060 回答
2

放开类型参数。将东西声明为LuxuryCar而不是CarType. 为什么你认为你需要一个类型参数?

于 2012-02-07T17:49:49.013 回答
0

我应该能够用任何特定的汽车测试抽象的豪华汽车服务,而无需重新实现测试方法。

那么这就是类型应该说的:

def testWithCar(car: Car): Unit = {} // or LuxuryCar if you meant "with any specific luxury car"
于 2012-02-07T20:01:26.603 回答
0

我很可能遗漏了一些东西,但是......为什么要在这里使用泛型呢?换句话说,为什么不

trait LuxuryCarService[LuxuryCar]

于 2012-02-07T21:41:33.850 回答