Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在Scala中初始化和使用抽象泛型类中的字段

在Scala中初始化和使用抽象泛型类中的字段
EN

Stack Overflow用户
提问于 2012-04-23 19:24:47
回答 2查看 781关注 0票数 1

我在scala中有类似这样的东西:

代码语言:javascript
代码运行次数:0
复制
abstract class Point[Type](n: String){
    val name = n
    var value: Type = _
}

到目前一切尚好。问题出现在扩展Point的类中。

代码语言:javascript
代码运行次数:0
复制
case class Input[Type](n:String) extends Point(n){
    def setValue(va: Type) = value = va
}

setValue代码行上,我遇到了这个问题:

代码语言:javascript
代码运行次数:0
复制
[error]  type mismatch;
[error]  found   : va.type (with underlying type Type)
[error]  required: Nothing
[error]   def setValue(va: Type) = value = va

我尝试用nullnull.asInstanceOf[Type]进行初始化,但结果是一样的。

如何初始化值以便可以在setValue中使用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-23 19:33:54

您应该指定Input使用泛型类型Type实现Point,因为现在,由于没有指定它,它被认为是Nothing (我猜编译器不能从setValue方法中推断出它)。因此,您必须执行以下操作:

代码语言:javascript
代码运行次数:0
复制
case class Input[Type](n:String) extends Point[Type](n){
  def setValue(va: Type) = value = va
}

更多信息

我回答了这个问题的编译错误(它可以在scala 2.9.0.1上编译)。此外,我认为这个case类是现有类型的实现,比如'Int‘。在抽象类中使用_当然不是一个好主意,但这并不是禁止的,但是_并不总是null,它是默认值,例如:var x:Int = _会将值0赋给x

票数 7
EN

Stack Overflow用户

发布于 2012-04-23 20:42:45

尝试以下操作:

包输入抽象

代码语言:javascript
代码运行次数:0
复制
abstract class Point[T](n:String){
  def value: T
  val name = n
}

case class Input[T](n:String, value:T) extends Point[T](n)

object testTypedCaseClass{
  def test(){
    val foo = Input("foo", "bar")
    println(foo)
  }
}

一个简单的应用程序来检查它是否正常工作:

代码语言:javascript
代码运行次数:0
复制
import inputabstraction._


object TestApp extends Application{
  testTypedCaseClass.test()  
}

说明

您正在犯的第一个错误是case class Input[Type](n:String) extends Point(n){Point是一个类型化的类,因此在使用extends Point(n)调用超类构造函数时,需要指定Point的类型。这是这样完成的:extends Point[T](n),其中T是您计划使用的类型。

第二个错误是您在这里定义和声明了值:t:var value: Type = _。在此语句中,_是一个值。它的值是Nothing。scala编译器由此推断Point[T]Point[Nothing]。因此,当您尝试将其设置为setValue方法体中的类型时,必须将其设置为Nothing,而这可能不是您想要的。如果您试图将它设置为除Nothing之外的任何值,您将得到上面的类型不匹配,因为由于您使用了_,value被类型化为Nothing

第三个错误是使用var而不是valdef。scala和def可以互换覆盖,这意味着子类型可以用valdef覆盖,scala编译器会为您解决这个问题。最佳实践是在抽象类和特征中使用def将函数定义为函数,因为子类型构造函数的初始化顺序很难确定(编译器如何决定如何从其超类型构造类有一个algorithm )。TL#DR ===在超类型中使用def。Case类参数是自动生成的val字段,由于您正在扩展一个Point,因此它将创建一个val value字段,该字段覆盖Point[T]中的def value字段。

您可以在Scala中摆脱所有这些Type||T抽象,因为类型推断和Point是抽象的,因此使得值可以通过val扩展。

像这样做依赖注入的首选方法是cake pattern,但我提供的这个示例适用于您的用例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10286898

复制
相关文章
现代OpenGL(一):我的第一个OpenGL程序
OpenGL是一种应用程序编程接口(Application Programming Interface,API)它是一种可以对图形硬件设备特征进行访问的软件库。 在OpenGL 3.0以前的版本或者使用兼容模式的OpenGL环境,OpenGL包含一个固定管线(fixed-function pipeline),它可以在不使用着色器的环境下处理几何与像素数据。我们看到的glBegin()、glRectf()以及glEnd()这些函数都是以前固定管线模式中所使用的API函数。 从3.1版本开始,固定管线从核心模式中去除,因此我们必须使用着色器来完成工作。现代OpenGL渲染管线严重依赖着色器来处理传入的数据,我们一般会使用GLSL(OpenGL Shading Language)编写着色器程序,GLSL语法类似于C语言,GLSL编译以后运行在GPU端。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.2K0
现代OpenGL(一):我的第一个OpenGL程序
openGL 入门4 --- Following the data
Example 1.2. Buffer Object Initialization
用户1148525
2019/07/01
4210
openGL 入门4 --- Following the data
OpenGL光照学习以及OpenGL4环境
前言 最近稍有空闲,整理下之前学习光照的笔记,以及在配置OpenGL4环境过程中遇到的问题。 光照 1、模拟灯光 模拟灯光:通过GPU来计算场景中的几何图形投射和散发出来的光线。 本质是GPU对每个三角形的顶点单独计算灯光,然后把结果再顶点之间的片元中进行插值。 故而当要求一个更真实、更光滑的灯光时,需要增加大量的三角形,从而加大计算量。 在上述这种情况,可以把灯光效果预处理并烘焙到纹理中。(就是形成一个纹理) 2、光照计算 光源=环境光 + 漫反射光 + 镜面反射光。 在计算光照的过程中,需
落影
2018/04/27
1.4K0
OpenGL光照学习以及OpenGL4环境
《译 SFML Essentials 英文版》—— 《第一章》 SFML 入门
当你开始开发一款游戏时,你可能想做的第一件事便是打开一扇窗口。在SFML中,这再容易不过了。创建窗口只需要一行代码:
全栈程序员站长
2022/11/18
3.1K0
《译 SFML Essentials 英文版》—— 《第一章》 SFML 入门
写个自己的Xcode4插件
刚写iOS程序的时候就知道Xcode支持第三方插件,比如ColorSense等很实用的插件,但Xcode的插件开发没有官方的文档支持,一直觉得很神秘,那今天就来揭开它的面纱。
JoeyBlue
2021/09/07
3140
Xmake v2.7.3 发布,包组件和 C++ 模块增量构建支持
它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能快速入门,能够让用户把更多的精力集中在实际的项目开发上。
ruki
2023/01/11
1K0
Xcode 调出4s模拟器
现在默认是没有4s以下的模拟器的,原因是 iPhone 4 系统最高升到7 iPhone4s也不支持10.2。现在Xcode最低提供8.1固件,所以还是可以调出iPhone4s模拟器。
星宇大前端
2019/01/15
6230
freeglut与GLFW介绍及其差别
        OpenGL可以在多种不同的平台之上运行,并且与各种不同的窗口系统配合工作。它的设计目标是作为窗口系统的补充,而不是它们功能的重复。因此,OpenGL在二维平面或三维空间中执行几何图形和图像的渲染,但是它并不对窗口进行管理,也不会处理输入事件。
步行者08
2022/05/11
1.3K0
iOS开发-OpenGL ES入门教程4
教程 OpenGL ES入门教程1-Tutorial01-GLKit OpenGL ES入门教程2-Tutorial02-shader入门 OpenGL ES入门教程3-Tutorial03-三维
落影
2018/04/27
1.2K0
iOS开发-OpenGL ES入门教程4
UE4 开发之配置 Xcode 调试环境
在上篇文章中,我与大家分享了如何在 UE4 里实现按钮事件响应的过程,应该来说如果跟着我的步骤操作下来,实现按钮事件响应还是很简单的,但是 UE4 开发对于新手来说还是有很多不友好的地方,基本上就是一个不断填坑的过程。
HelloWorld杰少
2022/08/04
1.8K0
UE4 开发之配置 Xcode 调试环境
使用c++SFML制作月圆之夜总集篇[通俗易懂]
重新以时间线的形式整理一下去年使用c++的SFML库制作月圆之夜(游戏程序设计大作业)的开发过程,括号里面是新的补充以及对一年前自己的吐槽
全栈程序员站长
2022/11/17
3.4K0
使用c++SFML制作月圆之夜总集篇[通俗易懂]
eigen库的使用_sfml是什么库
Eigen是开源的C++线性代数库,常用在计算机图形学中。 有份英文的Eigen使用手册,简要整理一下
全栈程序员站长
2022/09/27
7160
OpenGL绘制多边形边框线
利用OpenGL如何在绘制多边形的时候同时绘制其变现呢? 网上一种解决方案是利用glPolygonMode,将多边形绘制两次,一次绘制面,一次绘制边。这种方案理论上是可行的(我没有试过),但是OpenGL要进行两次绘制,效率上明显是不高的。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.7K0
OpenGL绘制多边形边框线
【OpenGL】九、OpenGL 绘制基础 ( OpenGL 状态机概念 | OpenGL 矩阵概念 )
上一篇博客 【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★ 进行了 OpenGL 渲染环境初始化 ;
韩曙亮
2023/03/28
4.2K0
OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换
通过模型矩阵,观察者矩阵(View Matrix),投影矩阵(Projection Matrix)三步矩阵变换后最终确定该展示怎样的图像。要注意的是矩阵的计算时从右往左的所以: result = 投影矩阵 * 观察者矩阵 * 模型矩阵。
用户8893176
2021/08/09
2.3K0
OpenGL(五)-- OpenGL中矩阵的变换OpenGL(五)-- OpenGL中矩阵的变换
Xcode 10
Xcode 10包含为所有Apple平台创建出色应用所需的一切。现在Xcode和Instruments在macOS Mojave上的新Dark Mode中看起来很棒。源代码编辑器允许您更轻松地转换或重构代码,查看源代码控制更改以及相关行,并快速获取有关上游代码差异的详细信息。您可以使用自定义可视化和数据分析构建自己的仪器。Swift可以更快地编译软件,帮助您提供更快的应用程序,并生成更小的二进制文件。测试套件的完成速度提高了很多倍,与团队合作更简单,更安全,等等。
iOSDevLog
2018/08/22
3.1K0
Xcode 10
Xcode Concepts
距离上次发文已经一个多月了,有许多小伙伴都在问我是不是不更了,其实不是哈,只是调整了节奏,改成了一月一篇,大家看一下这段时间的发文频率应该就能看出来。这篇文章原来准备四月底发出的,但忙着给公司项目写一个简单、轻量的网络抽象层(后面会开源出来,大家轻喷)框架有点耽误了,遂等到了五一后,这个算是四月份的更文,五月份的更文尽量不延期了哈。
CoderStar
2022/09/23
2.2K0
Xcode Concepts
Xcode探索
● application:didFinishLaunchingWithOptions 当应用程序载入后执行该方法。
云深无际
2021/04/14
9160
Xcode探索
opengl投影矩阵变换_opengl 坐标
A computer monitor is a 2D surface. A 3D scene rendered by OpenGL must be projected onto the computer screen as a 2D image. GL_PROJECTION matrix is used for this projection transformation. First, it transforms all vertex data from the eye coordinates to the clip coordinates. Then, these clip coordinates are also transformed to the normalized device coordinates (NDC) by dividing with w component of the clip coordinates.
全栈程序员站长
2022/11/04
1.7K0
opengl投影矩阵变换_opengl 坐标
点击加载更多

相似问题

Xcode 4 SFML 2错误

20

Xcode上的OpenGL版本- glfw对sfml

11

使用Xcode 4设置SFML 1.6

10

SFML位图字体(OpenGL)

10

C++ OpenGL SFML

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档