簡體   English   中英

多類型參數的Java泛型問題

[英]Java Generics questions for multiple type parameters

我有以下代碼:

public interface IDimension<S extends IDimension<S,T>, T extends Number> extends Comparable<S> {
  T toNumber();

  default T toBaseNumber() {
    return toNumber();
  }

  S fromNumber( T units );

  Class<T> numberType();
}

當我像下面那樣實現IDimensionImplementation1 ),我得到了'Type parameter 'TestBaseSample' is not within its bound; should implement 'IDimension<TestBaseSample<Float,Integer>, java.lang.Long>' 'Type parameter 'TestBaseSample' is not within its bound; should implement 'IDimension<TestBaseSample<Float,Integer>, java.lang.Long>'錯誤:

實施1:

class TestBaseSample<Integer, Float> 
    implements IDimension<TestBaseSample<Float, Integer>, Long> { 
}

我了解為什么“ Implementation1”會出錯,但無法理解為什么“ Implementation2”和“ Implementation3”有效嗎?

實施2:

class TestBaseSample2<Integer, Float> 
    implements IDimension<TestBaseSample2<Float, Float>, Long> {
}

實現3:

class TestBaseSample3<Integer, Float> 
    implements IDimension<TestBaseSample3<Integer, Integer>, Long> {
}

看起來您正在嘗試創建一個具體的類型,但實際上是在創建通用參數並為其指定Java類的名稱。

如果我們將通用參數更改為T和S,請考慮您的第一個示例TestBaseSample2

class TestBaseSample2<T, S> 
    implements IDimension<TestBaseSample2<S, S>, Long> {
}

現在,只要S是Long且T可以是其他任何東西,您就可以創建一個實例。

這是一個簡單的例子。

static class OtherList<Integer> extends ArrayList<Integer>{}

public static void main (String[] args) throws java.lang.Exception
{
    OtherList<String> list = new OtherList<>();
    list.add("this");
    System.out.println(list.size());
}

從實現中刪除所有類型(並且永遠不要使用類名來命名通用參數, 尤其是 JDK中的類-使用單個字母):

class TestBaseSample implements IDimension<TestBaseSample, Long> { 
}

class TestBaseSample2 implements IDimension<TestBaseSample2, Long> {
}

class TestBaseSample3 implements IDimension<TestBaseSample3, Long> {
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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