2016-11-03 4 views
0

Я не совсем уверен, что, на мой взгляд, проблема на самом деле. Но я пытаюсь использовать lazy в качестве делегата, и я получаю ошибки компилятораЛенивая инициализация свойства класса Kotlin не будет компилироваться

data class Geocode(var latitude: Double, var longitude: Double) : Comparable<Geocode> { 


    override fun compareTo(other: Geocode): Int { 
     var result = this.latitude.compareTo(other.latitude) 
     if (result == 0) 
      result = this.longitude.compareTo(other.longitude) 
     return result 
    } 
} 

data class HubKt(val position:Geocode) { 
} 

data class Example(val hubs:Collection<HubKt>) { 

    val bounds:Any by lazy { 
     object { 
      val ne: this.hubs.map { h -> h.position }.max() 
      val sw: this.hubs.map { h -> h.position }.min() 
     } 

    } 
} 

если это Java, я хотел бы функцию bounds вернуть карту:

public Map<String,Geocode> getBounds() { 
     Geocode ne = geos.stream().max(Geocode::compareTo).get(); 
     Geocode sw = geos.stream().min(Geocode::compareTo).get(); 
     return ImmutableMap.of("ne",ne,"sw",sw); 
} 

Я думаю, что проблема не использует правильный this. Я пробовал [email protected], и это не выход. Черт, я мог бы даже переусердствовать. Спасибо за понимание.

+0

Вам необходимо показать свои ошибки в компиляторе. И удалите «возврат» из ленивого, вы не вернетесь, когда в лямбда. –

+0

также, можете ли вы сделать образец, который имеет меньше зависимостей? –

+0

Будет обновлено прямо сейчас –

ответ

3

на основе текущего кода в вопросе:

data class Bounds(val ne: Geocode, val sw: Geocode) 

data class Example(val hubs:Collection<HubKt>) { 
    val bounds: Bounds by lazy { 
     Bounds(hubs.map { it.position }.max()!!, 
       hubs.map { it.position }.min()!!) 
    } 
} 

В противном случае в своем ответе вы не сможете получить доступ к ne и sw в вашем анонимной потомок Any, что вы создаете с помощью выражения объекта , Вам нужен типизированный ответ, такой как класс Bounds или Map (что было бы нехорошо). А также в вашей версии они могут быть пустыми. Если вы знаете, что у вас есть хотя бы одно значение в списке, вы можете использовать !!, чтобы утверждать, что вы знаете, что результат max или min не будет равен нулю.

Вы можете сделать это без копии, созданной карте с этим изменением:

data class Example(val hubs:Collection<HubKt>) { 
    val bounds: Bounds by lazy { 
     Bounds(hubs.maxBy { it.position }!!.position, 
       hubs.minBy { it.position }!!.position) 
    } 
}  

Или, если вы хотите аннулирует в качестве возможной оценки используют ?. безопасного оператора вместо !!. и изменить Bounds класс, чтобы разрешить null:

data class Bounds(val ne: Geocode?, val sw: Geocode?) 

data class Example(val hubs:Collection<HubKt>) { 
    val bounds by lazy { 
     Bounds(hubs.maxBy { it.position }?.position, 
       hubs.minBy { it.position }?.position) 
    } 
} 

Обратите внимание, что в последнем примере я уронил тип из val bounds: Bounds, потому что это не является обязательным и определение типа будет понять это только плавник е.

-1

Хорошо, я решил проблему: 2 раза

Синтаксис ошибки как "неизвестный символ"? Мне нужно было = и не :

val bounds:Any by lazy { 
     object { 
      val ne = hubs.map { h -> h.position }.max() 
      val sw = hubs.map { h -> h.position }.min() 
     } 

    } 

Ломбок (DOH!): position в Hub имеет это добытчик порождена Ломбок:

@Getter 
@Setter 
private Geocode position = new Geocode(50.0,50.0); 

Изменить на:

@Setter 
private Geocode position = new Geocode(50.0,50.0); 

public Geocode getPosition() { 
    return position; 
} 

В конечном счете это было проблема интеграции. sigh

+0

Этот ответ решает некоторые ошибки компилятора, но решение не работает. 'ne' и' sw' недоступны никому, потому что класс 'Any' создан из анонимного выражения объекта, к которому нельзя получить доступ по типу. –

+0

Вы внесли новую информацию в этот ответ, который должен был быть добавлен в вопрос. –

+0

Проблема Lombok, скорее всего, будет решена, если будет использован процессор аннотации Kotlin (KAPT), так что Lombok сделал свою магию, прежде чем компилятор Kotlin обработает исходный код, так как Kotlin запускается первым перед обработкой Java. Таким образом, ваш ответ работает вокруг этого, но не является правильным способом обработки интеграции с Java и обработчиками аннотаций. –

Смежные вопросы