Java 将类的子类作为类型参数传递(类型参数为子类)
让我们考虑一下:Java 将类的子类作为类型参数传递(类型参数为子类),java,scala,generics,scala-java-interop,f-bounded-polymorphism,Java,Scala,Generics,Scala Java Interop,F Bounded Polymorphism,让我们考虑一下: public class Text extends BinaryComparable implements WritableComparable<BinaryComparable> { 我在Scala上了一些课: trait MyClass[A <: WritableComparable[A]] { 由于类型不匹配。为什么?毕竟,Text是binaryCompariable如何解决它?writeableCompariable[binaryCompa
public class Text extends BinaryComparable
implements WritableComparable<BinaryComparable> {
我在Scala上了一些课:
trait MyClass[A <: WritableComparable[A]] {
由于类型不匹配。为什么?毕竟,
Text
是binaryCompariable
如何解决它?writeableCompariable[binaryCompariable]
与writeableCompariable[Text]
不相同,也不是writeableCompariable
的超类型,因为writeableCompariable
在T
中是不变的(Java泛型实际上没有协方差或逆变)
如果WritingComparable
被声明为trait WritingComparable[-A]
,那么它会
不过,您的上一个代码片段没有多大意义,因为MyClass
不接受2个类型参数(正如Luis Miguel Mejia Suarez提到的)。您不应该得到类型不匹配错误,它应该告诉您有太多的参数。我想你的意思只是MyClass[Text]
这是一个关于不变性、逆变换和协方差的问题。
writeablecomparable[BinaryComparable]
与writeablecomparable[Text]
不同,或者不是writeablecomparable[Text]
的超类型,因为writeablecomparable
在T
中是不变的(Java泛型实际上没有协方差或逆变)
如果WritingComparable
被声明为trait WritingComparable[-A]
,那么它会
不过,您的上一个代码片段没有多大意义,因为MyClass
不接受2个类型参数(正如Luis Miguel Mejia Suarez提到的)。您不应该得到类型不匹配错误,它应该告诉您有太多的参数。我想你的意思只是MyClass[Text]
这是一个关于不变性、逆变换和协方差的问题。您可以尝试再添加一个类型参数
trait MyClass[B >: A, A <: WritableComparable[B]]
val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}
您甚至可以使用存在类型排除B
(如@user建议的那样)
trait MyClass[A您可以尝试再添加一个类型参数
trait MyClass[B >: A, A <: WritableComparable[B]]
val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}
您甚至可以使用存在类型排除B
(如@user建议的那样)
trait MyClass[AMyClass
只取一个参数,你得到了哪个错误?MyClass
只取了一个参数,你得到了哪个错误?我编辑了它。你能告诉我,如何修复它吗?可能吗?@tomek.xyz我试过使用[\u>:A]
,但那是。一个可能会工作,但它是黑客,我真的建议重新考虑你的设计,如果你能控制MyClass
的类型参数。我编辑了它。你能告诉我,如何修复它吗?可能吗?@tomek.xyz我试过使用[\u>:A]
,但那是。A可能会工作,但它很粗糙,如果你能控制MyClass
的类型参数,我真的建议你重新考虑你的设计。老实说,我并不完全理解它。A:A
确实意味着A扩展了B
。为什么它能保证A
与所有A的超类型(这里称为B
)换句话说,它应该与MyClass[B,A哦,我现在明白了。基本上,我们表示A
有方法compareTo(BO)
,B
是A
的超类型。这确实意味着我们可以比较:new A().compareTo(*)
其中*是作为A
@tomek.xyz超类型实例的任意对象,它只是文本扩展二进制可比实现可写可比文本是A
,二进制可比是B
文本扩展…实现…
可以写成A:A,A老实说,我并不完全理解。A:A
确实意味着A扩展了B
。为什么它保证A
可以与A的所有超类型相比?(这里称为B
),换句话说,它应该与MyClass一起工作[B,A哦,我现在明白了。基本上,我们表示A
有方法compareTo(bo)
,B
是A
的超类型。这意味着我们可以比较:new A()。compareTo(*)
其中*是作为A
@tomek.xyz超类型实例的任意对象,它只是文本扩展二进制可比实现可写可比文本是A
,二进制可比是B
文本扩展…实现…
可以写成A:A,A
trait MyClass[B >: A, A <: WritableComparable[B]]
val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}
trait MyClass[B, A <: B with WritableComparable[B]]
val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}
trait MyClass[A <: B with WritableComparable[B] forSome { type B }]
val mc: MyClass[Text] = new MyClass[Text] {}