簡體   English   中英

將類的子類作為類型參數傳遞(類型參數是子類)

[英]Pass subclass of class as type parameter (type parameter is subclass)

讓我們考慮一下:

public class Text extends BinaryComparable
    implements WritableComparable<BinaryComparable> {

我們可以看到TextBinaryComparable

然后,讓我們考慮

@InterfaceAudience.Public
@InterfaceStability.Stable
public interface WritableComparable<T> extends Writable, Comparable<T> {

我在 Scala 有一些課程:

trait MyClass[A <: WritableComparable[A]] {

無法創建

MyClass[Text] = new MyClass[Text]()

由於類型不匹配。 為什么? 畢竟TextBinaryComparable怎么解決呢?

WritableComparable[BinaryComparable]WritableComparable[Text] ,也不是WritableComparable[Text]的超類型,因為WritableComparableT是不變的(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM