【问题标题】:How do i implement a generic class that calls a static method of specified interface in java我如何实现一个泛型类,该类在java中调用指定接口的静态方法
【发布时间】:2019-12-18 01:17:27
【问题描述】:

我有以下代码,但不能按预期工作。 当我使用 Grumbo 作为类型调用 Chumbles 构造函数时,它每次调用 Schlami 接口的静态方法而不是 Grumbo 的方法。 我在这里想念什么?什么解决方法,我很确定我需要一个,我应该实施吗?

提前致谢!

ps:我已经为我的命名约定感到抱歉了:D

编辑:我的意图: 我有几个类都需要转换为 JSON 并从 JSON 转换回一个类。 除此之外,我为它们中的每一个都有一个包装类,它包含一个类类型的数组列表,并且可以将该列表来回转换为 JSON。

所以我尝试构建一个通用类,我可以重用它来缩小代码。我的尝试是实现一个接口来保证这两种方法的存在并在该泛型类中调用它们。但这似乎不起作用。

知道对象转换不起作用。无论如何都不应调用该函数

public class main {

    public static void main(String[] args){

        Chumbles<Grumbo> schleem = new Chumbles<>("test");

        System.out.println("pause");
    }
}
public class Chumbles<T extends Schlami> {

    public Chumbles(String s){

        T fleeb = T.fromJSON(s);
        System.out.println(fleeb.toJSON());
    }
}
public class Grumbo implements Schlami {

    String s;

    public Grumbo(String s) {
        this.s = s;
    }

    @Override
    public String toJSON() {
        return "GrumboJSON";
    }

    public static Grumbo fromJSON(String s) {
        return new Grumbo("Grumbo Success ");
    }
}
public interface Schlami {

    String toJSON();

    static <T> T fromJSON(String json){

        return (T) new Object();
    }
}

EDIT2:所以我现在使用通用工厂类和 fromJSON 的非静态调用的组合。使用 new Grumbo().fromJSON(json) 感觉很恶心,但我会一直使用它,直到找到更好的解决方法。感谢大家的帮助。

【问题讨论】:

  • Chumbles&lt;T extends Schlami&gt;?这没有意义
  • 如果接口没有实例方法,为什么还要实现或扩展 Schlami?
  • 你的问题真的是伪装的XY Problem吗?您可能想告诉我们您正在尝试解决的总体问题,而不是您当前尝试解决的方式。
  • (T) new Object():保证会崩溃。静态接口方法不应该这样使用。
  • 对您的问题的简短回答:Java 没有办法做到这一点;改为创建显式工厂类。

标签: java generics interface static-methods


【解决方案1】:

所以,你的问题是为什么在“T.fromJSON(s);”调用 Schlami 的方法而不是 Grumbo 的方法? 由于 T 扩展了 Schlami,所以 Schlami 始终是调用静态方法时引用的类。 请注意,您不能覆盖静态方法!

我建议只通过“Grumbo.fromJSON();”调用该方法。如果您需要覆盖该方法,您可以将 Schlami 转为抽象类,在 Grumbo 中覆盖该方法并从对象上下文中调用它。

【讨论】:

  • 但 T 需要由 Schlami 扩展。否则我不能调用 schlami 方法。抽象类可能是解决方案,但我宁愿尝试其他解决方法。仅仅使用 Grumbo 并不能解决任何问题,因为另一个 Schlami 级无法使用它。
  • 如果你想坚持静态方法,你可以做的是在你的 Chumbles 构造函数中添加 ab 参数,让 T 的类存在,然后通过 class.getMethod() 调用方法:public Chumbles(String s, Class clazz) { Tfleb = clazz.getMethod("fromJSON", String.class).invoke(null, s) ; }
猜你喜欢
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 2020-11-28
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多