我想知道当我使用相互引用的泛型类时是否有办法消除原始类型警告:
public class DummyDeleteMe {
abstract class RightSide<L extends LeftSide>{ //Can I use a type parameter here?
L getLeftSide() {return _mate;}
void setLeftSide(L mate) {_mate = mate;}
L _mate;
void connectToMate(){
getLeftSide().setRightSide(this);//warning:
/** [unchecked] unchecked call to setRightSide(R) as a member of the raw type DummyDeleteMe.LeftSide
where R is a type-variable: * **/
}
}
abstract class LeftSide<R extends RightSide>{// And here?
R getRightSide(){return _mate;}
void setRightSide(R mate) {_mate = mate;}
R _mate;
}
class RightSideSub extends RightSide<LeftSideSub>{
void connectToMate(){
getLeftSide().setRightSide(this);//No warning
}
}
class LeftSideSub extends LeftSide<RightSideSub>{}
}
编译器警告是因为 LeftSide
参数绑定(bind)中是原始类型。将其替换为 LeftSide<?>
导致 connectToMate
中出现错误。覆盖connectToMate
在RightSideSub
,相同的代码不会生成警告。
我想我正在寻找某种第二种类型的参数,即自引用:
abstract class RightSide<R extends RightSide<R,L>, L extends LeftSide<L,R>>{}
但这会导致 R
中出现其他类型不匹配错误返回 R
的变量和方法.
最佳答案
我知道这可能不完全是您正在寻找的内容,但它可能会解决您的问题。仅根据您在代码示例中显示的内容,根本不需要泛型。这让问题过于复杂化了。也就是说,如果您的示例与您的需要相当接近。
假设是这样,这样怎么样?
public interface Half{
public Half getOtherHalf();
}
public class RightSide implements Half{
private LeftSide leftSide;
public void setLeftSide(LeftSide leftSide){
this.leftSide = leftSide;
}
@Override
public LeftSide getOtherHalf() {
return leftSide;
}
}
public class LeftSide implements Half{
private RightSide rightSide;
public void setRightSide(RightSide rightSide){
this.rightSide = rightSide;
}
@Override
public RightSide getOtherHalf(){
return rightSide;
}
}
关于java - 一种在没有警告的情况下创建匹配的泛型类对的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4632104/