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[A
MyClass
只取一个参数,你得到了哪个错误?
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] {}