如何获取泛型对象的两个对象及Function<Line, Color>中的Line与Color对象
嘿,我来帮你把这两个问题理清楚,都是Java泛型和函数式接口里的常见困惑:
问题1:如何获取泛型对象所包含的两个对象?
首先得明确:你说的“包含两个对象的泛型对象”,应该是像Pair<Line, Color>、Map.Entry<Line, Color>这类双元素泛型容器对吧?这类对象获取内部元素的核心逻辑是:
- 依赖该泛型类提供的公共访问方法,不同容器的方法名可能不一样:
- 如果是自定义的Pair类(比如下面这种):
那获取两个对象就直接调用public class Pair<T, U> { private final T first; private final U second; public Pair(T first, U second) { this.first = first; this.second = second; } // 提供获取内部对象的方法 public T getFirst() { return first; } public U getSecond() { return second; } }getFirst()和getSecond()就行:Pair<Line, Color> lineColorPair = new Pair<>(new Line(), new Color()); Line line = lineColorPair.getFirst(); Color color = lineColorPair.getSecond(); - 如果是Java自带的
Map.Entry<K, V>(比如HashMap的键值对),就用getKey()和getValue()方法获取两个对象。
- 如果是自定义的Pair类(比如下面这种):
- 注意:如果这个泛型类没有提供公共的访问方法,那你没法直接拿到内部对象(除非用反射,但这是不推荐的非常规操作,会破坏封装性)。
问题2:关于
Function<Line, Color>的理解是否正确? 先直接纠正你的误解:Function<Line, Color>类型的变量(比如你说的color参数)并不是包含Line和Color的对象!
它本质是一个函数式接口,简单来说,它代表的是一段“输入Line对象,输出Color对象”的逻辑——就像一个转换器:你把Line塞进去,它给你返回对应的Color,但它本身不持有任何Line或Color的实例,只是定义了转换规则。
那怎么访问Line和Color的属性呢?分两种场景:
- 如果你是调用这个Function:
你需要先传入一个具体的Line实例,调用apply()方法得到对应的Color实例,之后就能分别访问两者的属性了:public void handleLine(Function<Line, Color> colorConverter) { // 先创建或拿到一个具体的Line对象 Line myLine = new Line(0, 0, 100, 100); // 用Function把Line转换成Color Color resultColor = colorConverter.apply(myLine); // 访问Line的属性 int endY = myLine.getEndY(); // 访问Color的属性 int blueValue = resultColor.getBlue(); } - 如果你是自己实现这个Function:
在实现apply()方法的时候,你可以直接访问传入的Line对象的属性,也能操作生成的Color对象的属性:Function<Line, Color> lineToColor = inputLine -> { // 直接访问传入的Line的属性 int lineLength = inputLine.getLength(); // 根据Line的属性生成Color Color generatedColor = new Color(lineLength % 255, 0, 0); // 访问Color的属性 System.out.println("生成的红色值:" + generatedColor.getRed()); return generatedColor; };
内容的提问来源于stack exchange,提问作者Marcoo
相关产品推荐
相关产品推荐

