java - 一种在没有警告的情况下创建匹配的泛型类对的方法?

标签 java generics

我想知道当我使用相互引用的泛型类时是否有办法消除原始类型警告:

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 中出现错误。覆盖connectToMateRightSideSub ,相同的代码不会生成警告。

我想我正在寻找某种第二种类型的参数,即自引用:

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/

相关文章:

java - CDI 拦截器与 CDI 事件

java - FreeMarker 文件路径

java - Android Studio 访问 SQLite 数据库 Java

java - 了解具有类型删除的 Java 递归泛型类型定义

generics - 在 Typescript 中创建通用方法装饰器

java - 如果实现了具有通用参数的方法的接口(interface),Eclipse 会提示名称冲突

java - Minimax 算法不返回最佳移动

java - 从B类访问A类

java - 参数多态性的斗争

java - 重载泛型方法时 Java 5 和 6 之间的不同行为