当前位置: 首页 > 知识库问答 >
问题:

使用泛型时Java var推演失败

杭曦
2023-03-14
import java.lang.System;

interface Copy {
    
}

class Impl implements Copy {
    
    public <T extends Copy> T copy() {
        return (T)new Impl();
    }
    
    public void method() { System.out.println("hello"); }
    
}

public class MyClass {
    public static void main(String args[]) {
      var impl = new Impl();
      impl.method();
      var copy = impl.copy(); // deduction fails here
      copy.method();
    }
}

共有1个答案

卢书
2023-03-14

当您使用var时,编译器无法推断t的类型,并且在Java中泛型是编译时构造,使用类型擦除,所有泛型语法都将在运行时删除。如果只想使用var,可以显式指定泛型类型:

var copy = impl.<Impl>copy();

你也可以简单地写:

public Copy copy()
{
    return new Impl();
}

这引入了与t extends copy相同的约束。

interface Copy {
    public Copy copy(); 
}

class Impl implements Copy {
    
    @Override
    public Impl copy() {
        return new Impl();
    }
    
    public void method() { System.out.println("hello"); }
}

class MyClass {
    public static void main(String[] args) {
      var impl = new Impl();
      impl.method();
      var copy = impl.copy(); 
      copy.method();
 
    }
}
 类似资料:
  • 问题内容: 除了groovy之外,还有比Java更动态的方法。 为什么这是groovy中的编译时错误(意外令牌): 我该如何编写这种时髦的方式? 问题答案: Groovy解析器不处理以通用信息开头的方法签名。 它解析是否添加public修饰符: 虽然我不相信您会在编译时获得任何用于添加此批注的类型检查

  • 此代码在Java 8中编译,但在Java 7中编译失败: 它不能推断从映射返回的映射的具体类型。空(): 如果将调用更改为f(Map),则会编译。 但是如果您将调用更改为f(Map.empty())。放(1,“A”)。put(2,“B”)) ,它无法在Java 7和8上再次编译。为什么?

  • 问题内容: 我有以下签名的方法: 它读取json字符串,并将其转换为适当类型的对象的列表,例如。整数,字符串等 是否有一种可靠的方法可以通过从参数中推断出参数来将其从方法中删除?例如。有没有办法可以在不丢失功能的情况下将方法签名更改为以下内容? 似乎该解决方案将需要对ParameterizedType进行一些精美的操作。我看了以下内容,但是我使用的方法不正确,或者它们没有达到我的期望: 来自htt

  • 我在Haskell编程中的冒险并不都是史诗般的。我正在实现简单的Lambda演算,我很高兴完成了、以及,希望它们是正确的。剩下的是,就像红色框中定义的那样(在下图中),我正在为此寻找指导。 如果我说错了请指正, (1)但是我发现返回给定变量的类型。Haskell中的什么构造返回?我知道在中是,但我正在寻找一个在下工作的。 (3)对于(T-APP)和(T-ABS),我假设我分别对和应用程序应用了替换

  • 问题内容: 我正在为核心数据编写通用包装类。 这是我的一些基本类型。没什么特别的。 我已经将我的coredata写在协议中抽象化了。如果您让我知道您对我要提出的抽象的意见,我将不胜感激。但是在扩展中,我遇到了以下错误: 无法将类型“ NSFetchRequest”的值转换为预期的参数类型“ NSFetchRequest <_>” 不确定我该如何解决。我尝试了各种更改代码的尝试,但未成功…… 另外,

  • 问题内容: 我读到从Java 7开始,像在第一条语句中那样在右侧指定类型来创建Collections是不好的样式,因为编译器可以从左侧推断类型。 我的问题是,当像这样初始化列表时,编译器找不到类型,并且我收到未经检查的类型警告: 问题答案: 编译器不会 推断 类型,因为您正在实例化 raw 。但是它足够聪明,可以警告您在使用此(原始)对象时可能会出现问题。 值得一提的是此警告背后的原因。由于类型擦