Java Generics:泛型不在范围内的泛型

时间:2016-10-26 21:16:00

标签: java generics

我正在使用Java™中的泛型,并且发现我有一个小问题。我知道Java™使用type erasure;但是,我需要在运行时获取泛型的类。因此,我使用一个简单的解决方法来查找泛型的类,描述为here。我遇到的问题是当我编译时,javac吐出这个:

C:\blah\Board.java:65: error: type argument T#1 is not within bounds of type-variable T#2
  this.boardManager = new NumberBoardManager<T>(c);
                                             ^
where T#1,T#2 are type-variables:
  T#1 extends Comparable<? super T#1> declared in class Board
  T#2 extends Number,Comparable<? super T#2> declared in class NumberBoardManager
C:\blah\Board.java:65: error: constructor NumberBoardManager in class NumberBoardManager<T#2> cannot be applied to given types;
  this.boardManager = new NumberBoardManager<T>(c);
                      ^
required: Class<T#1>
found: Class<CAP#1>
reason: actual argument Class<CAP#1> cannot be converted to Class<T#1> by method invocation conversion
where T#1,T#2 are type-variables:
  T#1 extends Comparable<? super T#1> declared in class Board
  T#2 extends Number,Comparable<? super T#2> declared in class NumberBoardManager
where CAP#1 is a fresh type-variable:
  CAP#1 extends Object from capture of ?

第一个错误是有意义的,因为我所在的类Board有一个只扩展Comparable<? super T>的泛型,而这个特定的构造函数使用我想要的事实(但不一定有)泛型也扩展Number。我想通过使用通用我创建boardManager以扩展NumberComparable<? super T>来修复此问题,并在通用不扩展{{1}时出错}。但我不知道有什么语法可以帮助我。

导致第二个错误,因为我已使用通用Number初始化boardManager。但是,如果我们知道T实现T,为什么会抛出此错误?我希望通过解决第一个问题,第二个问题也得到了解决。这里有一些提供上下文的代码,如果你仍然感到困惑,我愿意提供更多。

Board.java

Comparable<? super T>

NumberBoardManager.java

public class Board<T extends Comparable<? super T>> extends Object implements Serializable
{
  private BoardManager<T> boardManager;

  public Board(int size)
  {
    Class<?> c = ((Class<?>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
    if(c.isAssignableFrom(Number.class))
    {
      this.boardManager = new NumberBoardManager<T>(c); //this is the line
    }
  }
}

任何和所有帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

我希望通过使用通用我来创建boardManager以扩展Number和Comparable来解决这个问题,并且如果泛型不扩展Number则会出错。

你做不到。

您不能在类上使用仅允许某些类型参数化的方法;该类必须能够使用任何允许的类型参数完全起作用。

您需要约束整个Board课程,使T成为Number

另一个错误是因为Class<?>Class<T>不兼容。 <?>表示类型参数可能是任何可能的类型;它可能是违反T约束的东西 您需要转换为Class<T>