【问题标题】:Create a mapping of String to Interface where the interface/function arguments and return types are different创建字符串到接口的映射,其中接口/函数参数和返回类型不同
【发布时间】:2019-12-18 14:17:31
【问题描述】:

我正在尝试实现一个Map<String, Interface>,其中有问题的接口接收并返回一个通用值,以便映射中的不同函数可以具有不同的返回类型,但仍使用相同的接口。我不太确定它是如何工作的,但目标是按照以下这些思路实现目标。

// A generic interface of some kind
public interface Action {
    Object doAction(Object object);
}
// The class which implements the map
public class MyClass { 

    public void example() {
        HashMap<String, Action> map = new HashMap<>();

        // this takes in a boolean and returns the opposing value
        map.put("functionOne", (boolean bool) -> !bool);

        // this takes in an integer, increments it and returns it.
        map.put("functionTwo", (int integer) -> integer++);

        ...
    }
}

显然这个伪代码是不正确的,我可能会偏离轨道,但我希望它能让您了解我想要实现的目标。任何帮助将不胜感激。

【问题讨论】:

  • 你不能这样做,至少不能像这样。如果你想要类似的东西,你将需要跳过更多的环节,例如,键包含Action 的类型,然后你需要做更多的事情来确保类型安全。
  • 例如,How to create a generic typesafe HashMap by class type? 之类的东西,但是您的密钥将是一个包含 Class 以获取类型信息的对象,我想您将不得不依赖不安全的强制转换来制作东西工作。
  • 马克是对的;可以创建地图,但在使用时必须知道所有内容,因为键入了 java。没有原始类型,在调用站点提供正确的参数并转换结果。和更多。事实上,这样的地图对于异类调度没有用..
  • 有没有一种方法可以在没有界面的情况下工作?例如,有一个 类型的映射(不太确定正确的类型是什么,因为 Runnable 仅适用于 void 对吗?)。这样,地图只是存储以函数为键的字符串。
  • @saxophonix 函数,Callable(标准接口)接受泛型类型的参数或返回值,因此它们是泛型接口。因此,在创建地图的情况下,无法回避类型安全问题。由于 Runnable 不带参数,因此它也不是您要寻找的。​​span>

标签: java dictionary generics interface


【解决方案1】:

首先,你的接口应该声明为FunctionalInterface。 其次,由于您的 doAction 方法将 Object 作为参数,我认为返回它没有意义,除非您想保留原始对象。您可以只修改方法内的对象并使您的方法void。调用该方法后,您传递的对象将被修改。 (你想使用 Int、Boolean 等对象,它们封装了原始类型)

但总体而言,这种方法似乎有点老式而且不可靠。因为这将导致您创建if 语句以确保您使用正确的类型(正如一些同事在 cmets 中所写的那样)。

我要做的是使Action 通用。

@FunctionalInterface
public interface Action<T> {
    T doAction(T argument);
} 

然后只需像下面这样声明您的函数并使用它们而不为它们创建集合,因为这将导致编写更多代码以确保类型安全。

Action<Boolean> booleanFunc = (Boolean bool) -> {...};

【讨论】:

  • 谢谢,现在这一切对我来说更有意义了,我想我只是把事情复杂化了,但这个解决方案对我有用! :)
  • 你的第一句话是错误的。任何只有一个抽象方法的接口都自动被认为是功能接口; @FunctionalInterface 只是形式,不需要。
  • @VGR 你是对的 :) 我只是用了不正确的词。有时使用这样的注解真的很有帮助,因为它们增加了代码的可读性,这就是我的意思
猜你喜欢
  • 2018-11-28
  • 1970-01-01
  • 2018-09-15
  • 2018-07-12
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多