【问题标题】:How to get type parameter in Java如何在Java中获取类型参数
【发布时间】:2018-06-13 16:00:18
【问题描述】:

我有一个实体如下:

public class Test extends AbstractEntity<Long> implements IHasDate { ... }

DAO 如下:

public class TestDAO extends AbstractDAO<Test, Long> { ... }

AbstractDAO中我想测试传递的类型参数Test是否是IHasDate的实例。

这是AbstractDAO 的定义:

public abstract class AbstractDAO<T extends AbstractEntity<ID>, ID extends Serializable> { 
    public void test(){ 
        // Here I want to test if the passed type parameter is an instance of IHasDate.
    }
}

我该如何解决这个问题?

【问题讨论】:

  • "Here I want to test if the passed type parameter is an instance of IHasDate." 哪一个? AbstractEntity&lt;ID&gt; 还是 ID? --- 你可以通过泛型参数的边界强制执行它,例如T extends AbstractEntity&lt;ID&gt; &amp; IHasDate
  • 不是骗子——充其量是 XY 问题。
  • @Turing85 类Test 是实现IHasDate 的类,所以在这种情况下T extends AbstractEntity&lt;ID&gt; 是我要测试的类。
  • @IchigoKurosaki 再次:您的实际问题是什么?这听起来很像一个 XY 问题。

标签: java


【解决方案1】:

如果您只想确保您的泛型被正确绑定,那么这基本上是不必要的。

您需要将AbstractDAO 绑定到IHasDate,而不是检查AbstractDAO 中的类型,尽管这很笨重。这意味着任何扩展IHasDate 的实体尝试使用它都将无法编译。

abstract class AbstractDAO<T extends AbstractEntity<ID> & IHasDate, ID extends Serializable> {
    public void test(){

    }
}

如果您创建一个绑定到IHasDate 的不同DAO,则使用上述方法可以实现类似的目标。

abstract class IHasDateDao<T extends AbstractEntity<ID> & IHasDate, ID extends Serializable> extends AbstractDAO<T, ID> {
}

【讨论】:

  • "如果您要做的只是确保您的泛型被正确绑定,那么这基本上是不必要的。" - 但遗憾的是,这不是 OP 想要的。
  • @Turing85:他们不想在AbstractDAO 上强制执行它,我提供了一个替代方案。
  • 没有 XY-Problems 生活会轻松很多 :)
【解决方案2】:

您可以使用方法 instanceof
if(yourObject instanceof yourClass){ ... }

【讨论】:

  • 该方法没有参数,因此您不一定要使用您的类的实例。
猜你喜欢
  • 2015-01-02
  • 2022-01-13
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 2013-06-14
相关资源
最近更新 更多