【问题标题】:Generic Class Parameter in function函数中的泛型类参数
【发布时间】:2013-10-27 16:39:23
【问题描述】:

我做了一个这样的课程

public class Item<IdType> {
    public IdType id;
    public String name;
}

public class Dealer<IdType> {
    public IdType id;
    public String name;
}

和其他类中的函数类似:

  public <T> boolean deleteById(Class<Class<T>> modelClass, T id) {
           daooperation();
           return true;
    }

我想要做的是当我用参数 1 调用函数 deleteById 是 Item&lt;Long&gt; 然后参数 2(id) 也应该使用 Long 数据类型 另一个例子是参数 1 的 deleteById 是 Dealer&lt;String&gt; 然后参数 2(id) 也应该使用 String 数据类型。如何将参数 1(modelClass) 解析为函数 deleteById 或者我应该更改 deleteById 中的参数 1(modelClass)? 请有人帮助我,告诉我我该怎么做。

【问题讨论】:

  • 您可能需要查找 Constraints on Type parameters
  • 对不起,你能解释一下吗
  • 你的 DAO 真的需要 Class 吗?
  • 您没有在任何地方的代码中使用modelClassid,所以一开始它们似乎没有必要。你能想出一个需要这种约束的情况吗?

标签: java generics dao


【解决方案1】:

我认为你的方法应该更像这样。

public static <I extends Item<T>, T> boolean deleteById(I item, T id) {
    doSomething();
    return true;
}

public static <D extends Dealer<T>, T> boolean deleteById(D dealer, T id) {
    doSomething();
    return true;
}

【讨论】:

  • 抱歉,我不希望“我”只绑定到项目类
  • 重载函数。我更新了代码部分以举例说明。通用“扩展”不支持“或”。
  • 嗨,感谢您的回复。我试图在android中制作DAO的API。所以我不想做一个功能来删除一种模型。我的计划是使用反射生成按 id 删除的查询。
  • 为什么不只是 public static &lt;T&gt; boolean deleteById(Item&lt;T&gt; item, T id)public static &lt;T&gt; boolean deleteById(Dealer&lt;T&gt; dealer, T id)
  • &lt;X extends Y&gt; 部分的术语又是什么?
【解决方案2】:

Object.Class 方法是我猜的解决方案

【讨论】:

    【解决方案3】:

    由于类型擦除和 Java 泛型的工作方式,您能做的最好的事情是:

    public class Test {
    
        public static <T extends WithId<B>, B> boolean foo(T obj, B id) {
            obj.id = id;
            return true;
        }
    
        public static void main(String[] args) {
            Bla<String> bar = new Bla<String>();
            foo(bar, "123"); // Works
            foo(bar,  123 ); // Fails
        }
    
    }
    
    abstract class WithId<T> {
        T id;
    }
    
    class Bla<T> extends WithId<T> {
        // ...
    }
    

    【讨论】:

    • 我可以避免创建新对象来传递给 foo 吗?
    • 问题在于,从WithId&lt;T&gt; 类型获取T 类型的唯一方法是提供具有该类型的对象或显式传递泛型类型。不,您不能拥有Class&lt;WithId&lt;T&gt;&gt;。悲伤但真实。
    • public static &lt;B&gt; boolean foo(WithId&lt;B&gt; obj, B id) 会更简单
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2010-10-04
    • 2019-03-05
    • 2021-06-27
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多