有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多类型参数的Java泛型问题

我有以下代码:

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>'错误:

实施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> {
}

共 (2) 个答案

  1. # 1 楼答案

    看起来您正在尝试创建一个具体类型,但实际上您正在创建泛型参数并为它们提供java类的名称

    考虑第一个例子^ {< CD1> },如果我们将泛型参数更改为t和s

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

    现在,您应该能够创建一个实例,只要S是一个长的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());
    }
    
  2. # 2 楼答案

    从实现中删除所有类型(不要使用类名命名泛型参数,尤其是JDK中的类-使用单个字母):

    class TestBaseSample implements IDimension<TestBaseSample, Long> { 
    }
    
    class TestBaseSample2 implements IDimension<TestBaseSample2, Long> {
    }
    
    class TestBaseSample3 implements IDimension<TestBaseSample3, Long> {
    }