变量实现两个接口

时间:2017-04-20 23:45:12

标签: java generics types

我已经看过很多类似的问题,但我认为没有任何相似的问题,也没有人完全回答我的问题。

假设有两个接口float minX, minY, minZ, maxX, maxY, maxZ; try { while(true) { if ("v ") { Vector3f ver = new Vector3f(Float.valueOf(curentLine[0]... ); if (ver.x < minX) minX = ver.x; else if (ver.x > maxX) maxX = ver.x; if (ver.y < minY) minY = ver.y; ... } ... } Tree。进一步假设我得到一个签名为

的方法

Named

如何将返回的值保存到变量中,同时仍然保留它同时实现public <T extends Tree & Named> T getNamedTree();Tree的信息?我无法找到一种声明像

这样的变量的方法

Named

并尝试将其转换为扩展public <T extends Tree & Named> T mNamedTree;Tree的接口,从而导致类强制转换异常。

3 个答案:

答案 0 :(得分:3)

假设没有继承NamedTree的第三个接口,则无法静态保留有关这两个接口的信息。编译器将要求您为其中一个或两者执行强制转换:

Object namedTree = getNamedTree();
Tree asTree = (Tree)namedTree;
Named asNamed = (Named)namedTree;

两个演员都应该成功。

如果您对该类的API设计有影响,请要求作者引入一个结合NamedTree的接口,并返回该接口的实例。

答案 1 :(得分:1)

一种可能的解决方案是创建另一个interface extends TreeNamed,并将其存储为变量:

interface NamedTree extends Tree, Named {

}

public NamedTree namedTree;

public NamedTree getNamedTree();

答案 2 :(得分:0)

变量必须具有什么范围?

这里有三种可能性。

A)变量只是一个局部变量。在这种情况下,你几乎已经有了答案......你只需要为该类型的封闭方法声明一个类型参数:

interface ItfA { Number propA(); };
interface ItfB { Number propB(); };

class Main {

  private <T extends ItfA & ItfB> T getT() {
     return null;
  }

  private <TT extends ItfA & ItfB> void doStuffWithT() {
     TT theT = getT();
     System.err.println(theT.propA());
     System.err.println(theT.propB());
  }

}

B)范围是对象的实时,在这种情况下是成员字段。 显而易见的答案是使类具有通用性和类型参数 具有相同的&约束:

interface ItfA { Number propA(); };
interface ItfB { Number propB(); };

class Main<T extends ItfA & ItfB> {

  T theT;

  public void setT(T newT) {
     theT = newT;
  }

  public void doStuffWithT() {
     System.err.println(theT.propA());
     System.err.println(theT.propB());
  }

}

C)范围是程序的实时,然后变量是静态类成员。在这里,您没有泛型解决方案。

C.1)显然,如果您要处理的值的类已知,则只需将该类用作字段类型。

C.2)如果没有,您可以约束代码以仅处理实现扩展ItfA和ItfB的接口的类。那个界面,比如ItfAB。将是字段类型。

C.3)现在,那么不强加那种约束呢?那么允许代码处理来自实现这些接口的任何类的对象呢?

不幸的是,没有一个简洁明了的解决方案:

C.3.a)​​您可以键入字段Object并提供以ItfA或ItfB(基本上隐藏转换)来访问它的方法。

C.3.b)或者,不是直接持有对象的引用,而是使用实现这些接口的代理对象,并将对这些接口方法的调用委托给原始的“T”类型值。该代理的类本身可以是接受任意<T extends ItfA & ItfB>值的泛型(类似于上面的B.示例)。