У меня есть ряд классов Java, которые действуют как оболочки для классов Java, например. Integer, String, ZonedDateTime и т. Д., И я помещаю их в этот Type<T>
интерфейс, где T
- это то, чем будет фактический базовый тип Java.
Есть еще один класс: final class Field<T, U extends Type<T>>
.
Наконец, у меня есть следующий интерфейс конструктора.
class DataBuilder {
<T, U extends Type<T>> DataBuilder addEntry(Field<T, U> field, T value) {
return this;
}
}
Это отлично работает при вызове со стороны Java:
public static void main(String[] args) {
Field<String, StringType> field1 = new Field<>();
Field<Boolean, BooleanType> field2 = new Field<>();
Map<Field, Object> map = new HashMap<>();
map.put(field1, "abc");
map.put(field2, true);
DataBuilder dataBuilder = new DataBuilder();
map.forEach(dataBuilder::addEntry);
System.out.println("good");
}
Вызов этого со стороны Scala вызывает некоторую проблему.
object Hello extends App {
val field1 = new Field[String, StringType]
val field2 = new Field[java.lang.Boolean, BooleanType]
val map = Map(
field1 -> "abc",
field2 -> boolean2Boolean(true)
)
val dataBuilder: DataBuilder = new DataBuilder
map.foreach { case (key, value) => dataBuilder.addEntry(key, value) }
}
Это дает мне три ошибки:
Error:(14, 50) inferred type arguments [Comparable[_ >: Boolean with String <: Comparable[_ >: Boolean with String <: java.io.Serializable] with java.io.Serializable] with java.io.Serializable,_2] do not conform to method addEntry's type parameter bounds [T,U <: example.Type[T]]
map.foreach { case (key, value) => dataBuilder.addEntry(key, value) }
Error:(14, 59) type mismatch;
found : example.Field[_1,_2] where type _2 >: example.BooleanType with example.StringType <: example.Type[_ >: Boolean with String <: Comparable[_ >: Boolean with String <: java.io.Serializable] with java.io.Serializable], type _1 >: Boolean with String <: Comparable[_ >: Boolean with String <: Comparable[_ >: Boolean with String <: java.io.Serializable] with java.io.Serializable] with java.io.Serializable
required: example.Field[T,U]
map.foreach { case (key, value) => dataBuilder.addEntry(key, value) }
Error:(14, 64) type mismatch;
found : Comparable[_ >: Boolean with String <: Comparable[_ >: Boolean with String <: Comparable[_ >: Boolean with String <: java.io.Serializable] with java.io.Serializable] with java.io.Serializable] with java.io.Serializable
required: T
map.foreach { case (key, value) => dataBuilder.addEntry(key, value) }
Я понимаю, что scala пытается определить наиболее точный тип, пытаясь найти общий тип для всех типов на карте, но есть ли способ не сделать его таким явным, при этом позволяя библиотеке java работать в scala?
См. Демонстрационный код в github: https://github.com/ssgao/java-scala-type-issue
Map
сAny
редко бывает хорошей идеей, когда цель состоит в том, чтобы сохранить типы (как это будет для конструктора, используемого после) - person cchantep   schedule 12.11.2019Map
. - person ssgao   schedule 12.11.2019