我已经看过很多类似的问题,但我认为没有任何相似的问题,也没有人完全回答我的问题。
假设有两个接口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
的接口,从而导致类强制转换异常。
答案 0 :(得分:3)
假设没有继承Named
和Tree
的第三个接口,则无法静态保留有关这两个接口的信息。编译器将要求您为其中一个或两者执行强制转换:
Object namedTree = getNamedTree();
Tree asTree = (Tree)namedTree;
Named asNamed = (Named)namedTree;
两个演员都应该成功。
如果您对该类的API设计有影响,请要求作者引入一个结合Named
和Tree
的接口,并返回该接口的实例。
答案 1 :(得分:1)
一种可能的解决方案是创建另一个interface
extends
Tree
和Named
,并将其存储为变量:
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.示例)。