2013-09-26 3 views
0

Я довольно новыми для Java и я немного запутался этим поведениемJava Дженерики с кратному Походные

public class MyBase<T> { 
static int id; 
} 

public class DerA extends MyBase<DerA> { 
} 

public class DerB extends MyBase<DerB> { 
} 

Я ожидаю DerA.id и Derid быть ДВА РАЗНЫХ static переменные. Но, похоже, это одно и то же! Поведение не имеет для меня никакого смысла - его 2 разных типа.

+2

Что это связано с дженериками? – qqilihq

+0

[code formating] (http://meta.stackexchange.com/questions/51144/how-do-i-post-code-in-stackoverflow) –

+0

Этот вопрос не имеет ничего общего с Generic Types в Java. Должно ли название редактироваться? – scottb

ответ

5

Дженерики не имеют к этому никакого отношения; В отличие от шаблонов в C++ у вас есть только один класс MyBase во время выполнения (он называется Type Erasure), поэтому он имеет только одну статическую переменную.

static переменные относятся только к классу, в котором они определены. Ни одна из производных не имеет этой переменной. То, что вы хотите, называется (на других языках, например Smalltalk) переменными класса, а Java не имеет такой вещи.

+0

+1 ... и этот вопрос не имеет ничего общего с дженериками. – Bohemian

+1

Ум .. не является синонимом «переменных класса» на самом деле «статическими переменными»? – scottb

+0

@scottb No. В Smalltalk и Python, например, у вас есть фактически переменные класса и метод, унаследованные/переопределенные и все такое. 'new' - такой метод класса в Smalltalk, и вы можете переопределить его в метаклассе. – Elazar

0

Переменные типа не относятся к статическому контексту. Например, вы не можете этого сделать:

public class MyBase<T> 
{ 
    static T t; 

    static void foo(T t){} 
} 
Смежные вопросы