Внутренний класс с верхней границей - PullRequest
0 голосов
/ 07 февраля 2012

Я хотел бы создать универсальный класс с параметром типа 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 ]

5 голосов
/ 07 февраля 2012

Вы сказали, что 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!

Я не уверен, что вы на самом деле имеете в виду для кода, но то, что вы написали, не должно (и не так, какты узнал) работа.

2 голосов
/ 07 февраля 2012

Отпустите параметр типа.Объявите вещи как LuxuryCar вместо CarType.Как вы думаете, зачем вам нужен параметр типа здесь?

0 голосов
/ 08 февраля 2012

Скорее всего, я что-то упустил, но ... зачем вообще использовать здесь дженерик? Другими словами, почему бы не

trait LuxuryCarService[LuxuryCar]

0 голосов
/ 08 февраля 2012

Я должен быть в состоянии протестировать сервис абстрактного роскошного автомобиля на любом конкретном автомобиле без необходимости повторного внедрения метода тестирования.

Тогда тип должен сказать:

def testWithCar(car: Car): Unit = {} // or LuxuryCar if you meant "with any specific luxury car"
...