[英]Pass subclass of class as type parameter (type parameter is subclass)
讓我們考慮一下:
public class Text extends BinaryComparable
implements WritableComparable<BinaryComparable> {
我們可以看到Text
是BinaryComparable
。
然后,讓我們考慮
@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T> extends Writable, Comparable<T> {
我在 Scala 有一些課程:
trait MyClass[A <: WritableComparable[A]] {
無法創建
MyClass[Text] = new MyClass[Text]()
由於類型不匹配。 為什么? 畢竟Text
是BinaryComparable
怎么解決呢?
WritableComparable[BinaryComparable]
與WritableComparable[Text]
,也不是WritableComparable[Text]
的超類型,因為WritableComparable
在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] {}
與trait MyClass[A <: WritableComparable[_ >: A]]
相反,這不會產生illegal cyclic reference
。
或者,您可以將MyClass
中的邊界定義為
trait MyClass[B, A <: B with WritableComparable[B]]
val mc: MyClass[BinaryComparable, Text] = new MyClass[BinaryComparable, Text] {}
您甚至可以使用存在類型排除B
(如@user建議的那樣)
trait MyClass[A <: B with WritableComparable[B] forSome { type B }]
val mc: MyClass[Text] = new MyClass[Text] {}
這種存在類型將在 Scala 3 中被棄用
http://dotty.epfl.ch/docs/reference/dropped-features/existential-types.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.